选择具有xmlns的节点?
我试图在xsl中选择xhtml文档中的所有链接。一些锚标记具有名称空间声明选择具有xmlns的节点?,xml,xslt,xhtml,namespaces,xml-namespaces,Xml,Xslt,Xhtml,Namespaces,Xml Namespaces,我试图在xsl中选择xhtml文档中的所有链接。一些锚标记具有名称空间声明xmlns=”http://www.w3.org/1999/xhtml“在它们中。未选择这些选项。e、 g.使用此xml文档: <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="xsl.xsl"?> <root> <item> this iz sum text and it haz sum <a x
xmlns=”http://www.w3.org/1999/xhtml“
在它们中。未选择这些选项。e、 g.使用此xml文档:
<?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>
此iz sum文本和其中的haz sum。
dem中的linx haz PIK。
这个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>
仅选择第二个链接。有人能解释一下这里发生了什么以及我如何修复它吗?如果您需要两个节点,它们位于不同的名称空间中,请使用:
/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">
....
如果需要两个节点,它们位于不同的名称空间中,请使用:
/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">
....
元素位于两个不同的名称空间中,默认名称空间和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>
元素位于两个不同的名称空间中,默认名称空间和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>
这很有效-谢谢你。这里的问题是并非所有链接都用名称空间标记。在样式表标记中将默认名称空间设置为正确的名称空间(xmlns=)http://www.w3.org/1999/xhtml“
)如果其他“匿名”节点也应位于该命名空间中,则应使/root/item/a
选择所有项。最后一个命名空间声明可用于输出,而不是用于选择。XSLT2.0在这方面有一个xpath默认名称空间
属性。@Alejandro:该死,你说得对,我没想清楚。如果所有节点都应该在同一个名称空间中,那么给OP的好建议是:遵循您的建议:)这很有效-谢谢。这里的问题是并非所有链接都用名称空间标记。在样式表标记中将默认名称空间设置为正确的名称空间(xmlns=)http://www.w3.org/1999/xhtml“
)如果其他“匿名”节点也应位于该命名空间中,则应使/root/item/a
选择所有项。最后一个命名空间声明可用于输出,而不是用于选择。XSLT2.0在这方面有一个xpath默认名称空间
属性。@Alejandro:该死,你说得对,我没想清楚。如果所有节点都应该在同一名称空间中,那么给OP的好建议是遵循您的建议:)