【问题标题】:XSLT document('') function doesn't workXSLT 文档('')函数不起作用
【发布时间】:2011-01-27 08:25:22
【问题描述】:

据我了解,以空字符串为参数的 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”?

【问题讨论】:

  • 你是如何运行转换的?
  • 为我工作。通过 Eclipse XSL Transformer 运行时,我得到了 test1test2
  • 如果您在Windows上使用MSXML库,您可能需要启用文档功能:styledocument.setProperty("AllowDocumentFunction", true);msdn.microsoft.com/en-us/library/ms256465.aspx
  • 我使用 xalan,它是 java 6 的一部分
  • 任何运行该样式表的尝试都会导致一些错误消息,例如“xsl:stylesheet 的子元素必须绑定到命名空间”

标签: xml xslt


【解决方案1】:

document('') 的定义是它读取的 XML 文档的 URI 与包含 document('') 调用的样式表中指令的基本 URI 相同。除非您使用外部实体,否则这通常与样式表模块的基本 URI 相同。如果它不起作用,这通常是因为样式表模块的基本 URI 是未知的。如果给 XSLT 处理器一个位于内存中的样式表(例如作为字符串或 DOM)而不是通过 URI 检索的资源,这很容易发生。例如,如果您使用 JAXP StreamSource 并且不调用 setSystemId(),则基本 URI 将是未知的。

【讨论】:

  • +1 好答案。此外,在某些环境中,某些权限级别可能不允许使用document() 函数。
【解决方案2】:

您应该声明自己的命名空间,如下所示:

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

【讨论】:

  • 在 Java 6 中仍然不起作用(使用 xalan)。但无论如何,谢谢,XSL 处理器的使用版本似乎需要一些特殊的语法
  • +1 语法错误。此外,您可以引用 specs“此外,xsl:stylesheet 元素可以包含任何不来自 XSLT 命名空间的元素,前提是该元素的扩展名称具有非空命名空间 URI。”
猜你喜欢
  • 2023-03-18
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
相关资源
最近更新 更多