我之前使用的是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。
答案 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()
的测试,您应该得到正确的脚注。