2010-10-04 24 views
0

J'essaie de sélectionner tous les liens dans un document xhtml en xsl. Certaines balises d'ancrage contiennent la déclaration d'espace de nom xmlns="http://www.w3.org/1999/xhtml". Ceux-ci ne sont pas sélectionnés. par exemple. avec ce doc xml:sélectionnez un nœud avec un xmlns?

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="xsl.xsl"?> 
<root> 
<item> 
this iz sum text and it haz sum <a xmlns="http://www.w3.org/1999/xhtml" href="http://cheezburger.com/">linx</a> in it. 
Teh linx haz piks of <a href="http://icanhascheezburger.com/">kittehs</a> in dem. 
</item> 
</root> 

et ce xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<dl> 
<xsl:for-each select="//root/item/a"> 
    <dd><xsl:value-of select="."/></dd> 
    <dt><xsl:value-of select="@href"/></dt> 
</xsl:for-each> 
</dl> 
</html> 
</xsl:template> 
</xsl:stylesheet> 

Seul le second lien est sélectionné. Quelqu'un peut-il expliquer ce qui se passe ici et comment je pourrais le réparer?

Répondre

2

Si vous avez besoin les deux nœuds, qui sont dans les différents espaces de noms, utilisez:

/root/item/*[local-name() = 'a'] 

Cependant, cela devrait rarement se produire, normalement, vous voulez un nœud d'un seul espace de noms:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:example="http://www.w3.org/1999/xhtml" 
    > 
.... 
<xsl:for-each select="/root/item/example:a"> 
+0

cela fonctionne - merci. le problème ici est que tous les liens ne sont pas marqués avec l'espace de nom. –

+0

La définition de l'espace de noms par défaut sur l'étiquette de style appropriée ('xmlns =" ​​http://www.w3.org/1999/xhtml "') devrait permettre à '/ root/item/a' de sélectionner tous les éléments si les autres nœuds «anonymes» devraient aussi être dans cet espace de noms. – Wrikken

+3

Cette dernière déclaration d'espace de nom est utile pour la sortie, pas pour select. XSLT 2.0 a un attribut 'xpath-default-namespace' pour cette question. –

1

Les éléments a se trouvent dans deux espaces de noms différents, l'espace de noms par défaut et l'espace de noms xhtml. Si vous déplacez le XPath en dehors de la mise en forme xhtml, vous pouvez utiliser les deux espaces de noms pour rechercher:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/"> 
    <xsl:variable name="links" xmlns:xhtml="http://www.w3.org/1999/xhtml" 
        select="//root/item/(a | xhtml:a)"/> 

    <html xmlns="http://www.w3.org/1999/xhtml"> 
     <dl> 
     <xsl:for-each select="$links"> 
      <dd><xsl:value-of select="."/></dd> 
      <dt><xsl:value-of select="@href"/></dt> 
     </xsl:for-each> 
     </dl> 
    </html> 
    </xsl:template> 

</xsl:stylesheet>