据我所知,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不起作用,还有其他一般方法吗?
答案 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::*)]">
但这确实是非常低效的无法思考。