如何在XSLT 2.0 xsl:key match属性中使用变量?

时间:2014-07-30 16:08:09

标签: xslt

<xsl:variable name="dictFile" select="document('dictionary.xml')" />
<xsl:key name="lookupTable" match="$dictFile/dictionary/item" use="@name" />
<xsl:variable name="lookup1" select="key('lookupTable','lookupA')" />
<xsl:variable name="lookup2" select="key('lookupTable','lookupB')" />

这不能用Saxon 9.5 EE编译返回错误:

XTSE0340 XSLT Pattern syntax error at char 0 on line 55 in {$dictFile}:
A variable reference is not allowed in an XSLT pattern (except in a predicate)

不幸的是,我需要保持这些变量lookup1和lookup2按原样定义。我想在这里改变尽可能少的代码。它是在支持这些类型构造的自定义企业XSL引擎上运行的非常古老的大型代码库。

2 个答案:

答案 0 :(得分:2)

标准XSLT 2.0中的正确方法是

<xsl:variable name="dictFile" select="document('dictionary.xml')" />

<xsl:key name="lookupTable" match="dictionary/item" use="@name" />

<xsl:variable name="lookup1" select="key('lookupTable','lookupA', $dictFile)" />
<xsl:variable name="lookup2" select="key('lookupTable','lookupB', $dictFile)" />

答案 1 :(得分:1)

XSLT 2.0 specification两个解决方案中讨论了这种确切的方案(向下滚动到示例:使用键引用其他文档部分)。