2017-08-23 2 views
0

Ma source HTML:Pourquoi ces modèles XSLT 1.0 ne parviennent-ils pas à supprimer des nœuds?

<!DOCTYPE html> 
<html class="no-js" lang="en-GB" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-GB"> 
    <head> 
     <meta name="generator" content="HTML Tidy for HTML5 for Linux version 5.2.0" /> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
     <title>Test</title> 
    </head> 
    <body> 
     <div class="lay-nav-primary"> 
      <ul class="TabMenu"> 
       <li> 
        <a href="http://example.com/">I am not wanted but am not removed.</a> 
       </li> 
      </ul> 
     </div> 
     <div class="lay-library--header"> 
      I am not wanted and am removed. 
     </div> 
     <p>I am not wanted but am not removed.</p> 
    </body> 
</html> 

Mon XSLT stylesheet:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/> 
    <xsl:strip-space elements="*"/> 

    <!-- Identity transform --> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <!-- Remove unwanted elements --> 

    <!-- successfully removes node with the given class --> 
    <xsl:template match="//*[contains(concat(' ', normalize-space(@class), ' '), ' lay-library--header ')]"/> 

    <!-- fails to remove 'ul' child node of node with the given class --> 
    <xsl:template match="//*[contains(concat(' ', normalize-space(@class), ' '), ' lay-nav-primary ')]/ul"/> 

    <!-- fails to remove 'p' nodes --> 
    <xsl:template match="p | p/* | //p | //p/*"/> 

    <!-- fails to remove 'p' nodes --> 
    <xsl:template match="p | p/* | //p | //p/*" priority="9"/> 

</xsl:stylesheet> 

Je ne vois pas pourquoi les trois derniers modèles ne fonctionnent pas comme je pense lorsque le premier est. Merci.

+0

En dehors - je ne fonctionne pas XSLT sur HTML (par exemple si bien affichée est de forme) que les règles de marquage diffèrent des normes XML plus strictes. S'il existe un fichier source dans ce code HTML, pensez à styliser ce document, pas la sortie. – Parfait

+0

Merci pour la note. Il n'y a pas une seule source que je puisse utiliser car le HTML est la sortie des modèles d'une application web. J'utilise http://www.html-tidy.org/ pour convertir du HTML en XHTML. –

Répondre

1

Votre code HTML/XML est dans l'espace de nom par défaut http://www.w3.org/1999/xhtml. Liez cela à un préfixe et utilisez-le dans vos XPaths.

De même, il n'est pas nécessaire d'utiliser // dans les correspondances de modèle.

... Exemple

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:x="http://www.w3.org/1999/xhtml"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/> 
    <xsl:strip-space elements="*"/> 

    <!-- Identity transform --> 
    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <!-- Remove unwanted elements --> 

    <!-- successfully removes node with the given class --> 
    <xsl:template match="*[contains(concat(' ', normalize-space(@class), ' '), ' lay-library--header ')]"/> 

    <!-- successfully removes 'x:ul' child node of node with the given class --> 
    <xsl:template match="*[contains(concat(' ', normalize-space(@class), ' '), ' lay-nav-primary ')]/x:ul"/> 

    <!--successfully removes x:p nodes--> 
    <xsl:template match="x:p"/> 

</xsl:stylesheet>