【问题标题】:xslt-1.0 iterate over fixed list of valuesxslt-1.0 迭代固定的值列表
【发布时间】:2014-04-03 13:49:13
【问题描述】:

我需要从可能包含也可能不包含每种语言信息的输入中为固定数量的语言生成 XML 结构。如果缺少信息,我需要生成空元素。问题是,我需要在输出结构的许多地方迭代语言。

最简单的方法是使用类似的东西

<xsl:variable name="languages" select="en,de,fr">
<xsl:for-each select="$languages">
...
</xsl:for-each>

循环出现在我需要语言列表的任何地方。

当然这不起作用,因为select="en,de,fr" 没有定义节点列表。通过扩展,我可以使用node-set 函数,但我坚持使用 XSLT-1.0。

有没有办法定义一个常量节点集来迭代?

(这在某种程度上与another question 相关,其中接受的答案扼杀了许多创建常量节点集的想法,特别是所有需要&lt;xsl:variable/&gt; 子元素的东西)

【问题讨论】:

    标签: xslt xslt-1.0


    【解决方案1】:

    如果您想要一个 constant 节点集,而不是其内容由 xsl: 指令计算的节点集,那么您可以使用 document('') 做一个技巧,让您可以访问样式表本身:

    <xsl:variable name="languagesLiteral">
      <lang>en</lang>
      <lang>de</lang>
      <lang>fr</lang>
    </xsl:variable>
    
    <xsl:variable name="languages"
         select="document('')//xsl:variable[@name='languagesLiteral']/*" />
    

    这仅适用于静态值,例如,如果您有 &lt;xsl:variable name="foo"&gt;&lt;xsl:for-each ...&gt;,那么您从 document('') 技巧获得的节点集将是 xsl:for-each 元素,而不是评估它的结果。

    【讨论】:

    • 幸运的是,在我的用例中,只需要静态值。
    • 好吧,与此同时,我了解到一个丑陋的副作用:当我循环 $languages 时,在循环内我似乎无法再访问原始文档。 &lt;xsl:value-of select="/"/&gt; 什么也不返回 :-( 知道如何解决这个问题吗?
    • @Harald 在输入 for-each(它可能是样式表顶层的全局变量)并使用 $root/whatever 之前,您必须将其存储在变量 &lt;xsl:variable name="root" select="/" /&gt; 中。正如您所发现的,/ 本身表示当前文档的根,而在 $languages 之上的 for-each 内部表示样式表 (document(''))。
    • @Harald 请注意,exslt:node-set() 方法会遇到完全相同的问题 - / 将是转换为节点集的文档片段的根,而不是原始根输入。
    • 非常感谢。在看到$root 的解决方案后,至少这个是显而易见的,但我处于完全困惑的模式。 XSL 一直是一个严重的时间槽:-(
    猜你喜欢
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多