我需要从输入生成固定数量语言的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有某种关系,其中接受的答案杀死了许多创建常量节点集的想法,特别是需要<xsl:variable/>
的子元素的所有内容
答案 0 :(得分:2)
如果您想要一个常量节点集而不是其内容由xsl:
指令计算的节点集,那么您可以使用document('')
进行操作,这样您就可以访问样式表本身的XML树:
<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']/*" />
这仅适用于静态值,如果您有<xsl:variable name="foo"><xsl:for-each ...>
,那么您从document('')
技巧获得的节点集将是xsl:for-each
元素,而不是评估它的结果