据我所知,使用空字符串作为参数的XSLT函数document()应该读取当前的XSLT文档。但是以下代码不起作用:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<state>test2</state>
<xsl:template match="/">
test1
<xsl:value-of select="document('')/*/state"/>
</xsl:template>
</xsl:stylesheet>
当我将这个XSLT应用于某些XML(仅作为示例)时,我只有“test1”作为输出。为什么行
<xsl:value-of select="document('')/*/state"/>
不打印“test2”?
答案 0 :(得分:10)
文档('')的定义是它读取的XML文档的URI与包含文档('')调用的样式表中的指令的基URI相同。除非您使用外部实体,否则这通常与样式表模块的基URI相同。如果它不起作用,这通常是因为样式表模块的基URI是未知的。如果为XSLT处理器提供内存中的样式表(例如作为字符串或DOM)而不是通过URI检索的资源,则很容易发生这种情况。例如,如果您使用JAXP StreamSource并且不调用setSystemId(),则基URI将是未知的。
答案 1 :(得分:1)
您应该声明自己的命名空间,如下所示:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="http://localhost"
exclude-result-prefixes="my">
<xsl:output method="text"/>
<my:state>test2</my:state>
<xsl:template match="/">
<xsl:text>test1</xsl:text>
<xsl:value-of select="document('')/*/my:state"/>
</xsl:template>
</xsl:stylesheet>
输出继电器:
test1test2
引用迈克尔凯:
用户定义的顶级元素必须 也属于带有的命名空间 非空URI,与XSLT不同 命名空间,最好是不同的 来自any使用的名称空间URI 供应商。这些元素被忽略 XSLT处理器。