<!-- <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://localhost" xsi:schemaLocation="http://localhost example.xsd"> -->
这与使用 XML 模式无关。问题是您指定了默认名称空间.
在默认名称空间中使用 XPath 表达式作为节点名称是最大的 XPath 常见问题解答。
请在 xpath 和 xslt 标签中搜索“默认名称空间”,您会找到很多好的答案。
XSLT 的解决方案就是声明一个带有一些前缀(例如“x”)的命名空间,并且命名空间-uri 与 XML 文档中默认命名空间的命名空间-uri 相同。然后在任何 XPath 表达式中使用x:name
代替name
.
因此你的 XSLT 代码就变成了:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="http://localhost" exclude-result-prefixes="x" >
<xsl:template match="/">
<ul>
<xsl:for-each select="x:root/x:element">
<li>
<xsl:value-of select="."/>
</li>
</xsl:for-each>
</ul>
</xsl:template>
</xsl:stylesheet>
当应用于提供的未注释的 XML 文档时<root>
元素:
<root xmlns="http://localhost"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://localhost example.xsd">
<element>Element 1</element>
<element>Element 2</element>
<element>Element 3</element>
</root>
产生了想要的正确结果:
<ul>
<li>Element 1</li>
<li>Element 2</li>
<li>Element 3</li>
</ul>