xml - 选择一个带有 xmlns 的节点?

标签 xml xslt xhtml namespaces xml-namespaces

我试图在 xsl 中选择 xhtml 文档中的所有链接。一些 anchor 标记具有命名空间声明 xmlns="http://www.w3.org/1999/xhtml"在他们之中。这些没有被选中。例如使用此 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>

和这个 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">

关于xml - 选择一个带有 xmlns 的节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3858843/

相关文章:

c# - 遍历 XML 文档

xml - 与 xmlstarlet 作斗争

.net - 以编程方式以缩进形式格式化 XML,就像 Visual Studio 的自动格式化一样

c# - 使用 System.Web.Optimization 时如何将类型 ="text/javascript"添加到脚本标记

css - 为什么这在 Strict XHTML 1.0 中有效?

json - 是否有用于从一张表中读取行的 RESTful Google Sheets API?

java - XSLT CallTemplate ForEach XML 扩展函数

Eclipse 支持 .xsl 文件中的断点吗?

html - 在 xsl :apply-templates tag 中正确使用 xpath 的 "select="属性

html - 是否有原生内联 block HTML 'container' 元素?