我正在尝试通过 XSLT 转换将 XML 文档解析为网站。
但是,要使其工作,我必须使用以下 XPath:
/*[name()='standards']/*[name() = 'standard']
为什么以下 XPath 表达式不起作用?
/standards/standard
您的问题是 XPath 中最常见的问题——搜索 XPath 和默认命名空间,您会找到很多好的答案。
总结问题:XPath 将任何无前缀的名称解释为属于“无命名空间”。
因此,不会选择任何 XPath 表达式中属于某个默认命名空间(不是“无命名空间”)的任何无前缀名称。
在定位步骤中继续使用名称的一种方法是向 XPath 处理器指示特定前缀(例如“x”)与默认名称空间相关联。然后发出:
/x:standards/x:standard
在 .NET中,此类命名空间绑定(称为“命名空间注册”)是使用XmlNamespaceManager
类完成的。请参阅此完整示例。
在 XSLT中,只需在全局级别定义名称空间,然后指定 XPath 表达式,其中每个元素名称都以这样定义的前缀作为前缀。
这是一个小例子:
<nums xmlns="some:nums">
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
为了处理上面的 XML 文档,我们有这个:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="some:nums">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:value-of select="/x:nums/x:num[. = 3]"/>
</xsl:template>
</xsl:stylesheet>
将此转换应用于上述 XML 文档可以正确选择所需元素并输出其字符串值:
03
我不知道你的问题是什么。随便一刀,也许这就是你想要的……
<xsl:stylesheet version="1.0"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ikas="http://www.ikas.dk"
exclude-result-prefixes="msxsl ikas">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<div xmlns="http://www.ikas.dk">
<textarea>
<xsl:copy-of select="/ikas:standards/ikas:standard"/>
</textarea>
</div>
</xsl:template>
</xsl:stylesheet>