XSLT1中XPATH表达式中的变量

时间:2013-11-23 16:27:52

标签: xml xslt xpath

我之前使用的是XSLT 2.0,但由于某些原因决定使XSLT 1.0兼容,而且从我读过/发现的内容来看,变量在XSLT 1.0中的XPATH表达式中不起作用。

这是我在XSLT 2.0中使用的原始XSL:

<xsl:template match="footnote_ref">
  <xsl:variable as="xs:integer" name="ref" select="."/>
  <xsl:variable name="fid" select="generate-id(../following-sibling::footnote_list[1]/footnote[$ref])"/>
  <sup><a href="#{$fid}">
    <xsl:value-of select="."/>
  </a></sup>
</xsl:template>

对于引用n,它将链接到下一个脚注部分中的n脚注。

在XSLT 1.0中,这不起作用,似乎忽略了[$ref]部分,只是链接到第一个脚注,无论如何。我认为来自EXSLT的dyn:evaluate会起作用,所以我尝试了:

<xsl:variable name="fid" select="dyn:evaluate('generate-id(../following-sibling::footnote_list[1]/footnote[$ref])')"/>

如果我理解正确,则应评估为generate-id(../following-sibling::footnote_list[1]/footnote[$ref]),但替换为$ref。在example中,他们显示使用变量很好,但这仍然不起作用,就像没有dyn:evaluate一样,完全忽略变量。

我做错了什么或误解dyn:evaluate?如果重要的是我通过lxml(Python)使用libxslt。

1 个答案:

答案 0 :(得分:1)

  

在XSLT 1.0中,这不起作用,似乎忽略了[$ref]部分,只是链接到第一个脚注。

XSLT 1.0不支持as上的xsl:variable属性。所以在下面:

<xsl:template match="footnote_ref">
  <xsl:variable name="ref" select="."/>
  <xsl:variable name="fid" select="generate-id(../following-sibling::footnote_list[1]/footnote[$ref])"/>
  <sup><a href="#{$fid}">
    <xsl:value-of select="."/>
  </a></sup>
</xsl:template>

$ref是一个节点集,因此footnote[$ref]中的最终谓词表示“选择所有footnote个元素,使得节点集$ref不为空”(即全部他们)。当您将一组节点传递给generate-id时,您将按文档顺序返回集合中第一个节点的ID。但如果你说

  <xsl:variable name="ref" select="number(.)"/>

然后$ref是一个数字,谓词将执行您需要的基于position()的测试,您应该得到正确的脚注。