2010-10-04 98 views
0

我试图选择xsl中xhtml文档中的所有链接。一些锚标签中有名称空间声明xmlns="http://www.w3.org/1999/xhtml"。这些未被选中。例如与该XML文档:用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> 

这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> 

只有第二链接被选择。有人可以解释这里发生了什么,以及我可以如何解决它?

回答

2

如果您需要两个节点,这是在不同的命名空间,使用方法:

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

然而,这应该罕发生,通常情况下,你想只从一个命名空间中的一个节点:

<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

此作品 - 谢谢。这里的问题是不是所有的链接都用名字空间标记。 – 2010-10-04 20:37:07

+0

在样式表标签('xmlns =“http://www.w3.org/1999/xhtml”')中将默认命名空间设置为正确的命名空间应该可以使'/ root/item/a'选择所有项目if其他'匿名'节点也应该在该名称空间中。 – Wrikken 2010-10-04 20:39:31

+3

最后一个名称空间声明对输出有用,不适用于select。对于这个问题,XSLT 2.0有一个'xpath-default-namespace'属性。 – 2010-10-04 20:42:45

1

a元素位于2个不同的名称空间中,即默认名称空间和xhtml名称空间。如果您将XPath移动到xhtml格式之外,则可以使用两个名称空间进行搜索:

<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>