XSLT模板匹配:用于将不允许的轴移动到谓词的配方

时间:2013-11-27 23:26:20

标签: xslt xpath match axes

据我所知,XSLT 1.0标准不允许匹配表达式的StepPatern部分中的大多数XPath轴。 (参见this question,推荐的替代方案是在Predicate中使用所需的轴。)

我有一个复杂的XPath表达式,它返回一个节点集 node-set-expression 。我想制作一个匹配 node-set-expression / following-sibling::*的模板。有没有一种通用的方法来重写它以使用谓词,以便它可以在XSLT match元素的template属性中使用?

并且等效地,是否存在翻译以下内容的一般方法:

node-set-expression / preceding-sibling::*

node-set-expression / self-and-following-sibling::*(这是速记;我知道它是not a valid axis

如果Predicates不起作用,还有其他一般方法吗?

1 个答案:

答案 0 :(得分:2)

在XSLT 2.0中,我倾向于通过预选全局变量中的匹配节点来处理这种情况:

<xsl:variable name="special-nodes" select="//something/preceding-sibling::*"/>

<xsl:template match="*[. intersect $special-nodes]"/>

在XSLT 3.0中,这将进一步简化为

<xsl:template match="$special-nodes"/>

这样做的一个好处是,在执行apply-templates时,一次搜索“特殊节点”可能比针对每个这样的模式测试每个节点要高效得多;在我看来,它也使条件更加清晰。

我对XSLT 1.0的问题所知道的唯一通用解决方案是将模式编写为

<xsl:template match="*[count(.|//something/preceding-sibling::*) =
                       count(//something/preceding-sibling::*)]">

但这确实是非常低效的无法思考。