XSLT文档('')函数不起作用

时间:2011-01-27 08:25:23

标签: xml xslt

据我所知,使用空字符串作为参数的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”?

2 个答案:

答案 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处理器。