【问题标题】:XSLT include and document('') collisionXSLT 包含和文档('')冲突
【发布时间】:2010-10-20 21:36:12
【问题描述】:

我有两个 XSLT 文件 A.xslt 和 B.xslt,其中 A.xslt 包括 B.xslt.

A.xslt

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:my="my_namespace">

    <my:data>This is A.xslt</my:data> 

    <xsl:include href="B.xslt"/>

    <xsl:template name="my_template">
        <xsl:value-of select="$remote-data"/>
    </xsl:template>

</xsl:stylesheet>

B.xslt

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:my="my_namespace">

    <xsl:variable name="remote-data"
                   select="document('')/*/my:data" />

</xsl:stylesheet>

当然,当评估my_template时,会输出空行。发生这种情况是因为 B.xslt 不包含 my:data 容器并且document('') 调用在包含之前被处理。

我的问题是:我如何从 B.xslt 访问 my:data(使 document('') 在包含后进行处理) ?

感谢任何想法!

更新:在现实生活中,我有多个文件,例如 A.xslt:A1.xslt、A2 .xslt,... 并且需要使用 nodeset 作为结果进行完全相同的计算(如在$remote-data 定义中),但使用不同的参数(存储在 my:data 中)。 p>

可以说我可以为此使用命名模板。但据我所知,这是不可能的,因为模板会返回 RTF,我必须将其返回到 node-set(),这在 XSLT 1.0 解析器中通常不可用。

希望这能澄清我的问题。

【问题讨论】:

  • 好问题,+1。请参阅我的答案以了解两种可能的解决方案。

标签: xml xslt document


【解决方案1】:

以空路径调用的document() 函数将引用代码块“存在”其中的XSLT 的源XML 文档。在本例中,它是B.xslt

如果您想从 A.xslt 加载/引用 XML,请将您的行更改为:

<xsl:variable name="remote-data"
                   select="document('A.xslt')/*/my:data" />

【讨论】:

  • +1 好答案。 fn:document() 行为背后的逻辑是将空字符串参数解析为 stylesheet URIA.xslt 的 URI 应该不同于 B.xslt
  • @Savva:更新与我提出的解决方案无关——将数据定义在单个全局 &lt;xsl:variable&gt; 中就足够了。然后可以在所有包含/导入的样式表中访问此变量。无需任何扩展功能。
【解决方案2】:

有两种可能

.1。正如@Mads-Hansen 已经推荐的那样,使用:

<xsl:variable name="remote-data" 
                   select="document('A.xslt')/*/my:data" /> 

.2。移动A.xslt中$remote-data变量的定义:

<xsl:variable name="remote-data"    
               select="document('')/*/my:data" />

那么就可以通过B.xslt的代码来访问了,因为全局定义的&lt;xsl:variable&gt;s在所有包含或导入的样式表模块中都可以访问。

【讨论】:

    猜你喜欢
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多