XSLT将样式从3.0转换为2.0-变量引用错误

XSLT将样式从3.0转换为2.0-变量引用错误,xslt,xslt-2.0,xslt-3.0,Xslt,Xslt 2.0,Xslt 3.0,我有一个大型XSL3.0样式表,需要将其转换为XSL2.0。在整个文档中似乎重复了一个错误,但我不确定如何修复它 例如,在XSL 3.0中,我声明了以下变量: <xsl:variable name="glosspath" select="/tei:TEI/tei:text//tei:add"/> <xsl:variable name="apppath" select="/tei:TEI/tei:text//tei:del | /tei:TEI/tei:text//tei

我有一个大型XSL3.0样式表,需要将其转换为XSL2.0。在整个文档中似乎重复了一个错误,但我不确定如何修复它

例如,在XSL 3.0中,我声明了以下变量:

<xsl:variable name="glosspath" 
select="/tei:TEI/tei:text//tei:add"/> 

<xsl:variable name="apppath" 
select="/tei:TEI/tei:text//tei:del | /tei:TEI/tei:text//tei:surplus | /tei:TEI/tei:text//tei:supplied[@reason='added'] 
| /tei:TEI/tei:text//tei:choice[@style='sic'] | /tei:TEI/tei:text//tei:sic[@style='sic'] | /tei:TEI/tei:text//tei:gap 
| /tei:TEI/tei:text//tei:note[@type='reading']"/> 

然后我在各种环境中使用这些变量,比如

<xsl:template match="$glosspath">...
。。。
或:


所有变量都抛出相同的错误:{$glosspath}中第635行char 0处的
XTSE0340 XSLT模式语法错误:XSLT模式中不允许变量引用(谓词中除外)

我已经在网站上查看了各种答案,如和,但我不确定如何重新编写此内容以符合


非常感谢。

我相信对于模板匹配,您可以做到这一点

<xsl:template match="*[. intersect $glosspath]">

对于数字,您可以这样做(尽管这不一定是有效的)



编辑:更改为使用
intersect
。感谢Martin Honnen

这将是一件困难的事,除非您能够基本上用完整路径替换变量的任何模式使用,例如
而不是
@MartinHonnen。如果是一次性问题,那么替换它们并不困难。随着时间的推移,如果添加了其他节点,则实际上是关于代码维护——变量在62个位置使用。是否要使用
*[.is$glosspath]
?即使只有当变量选择单个节点时,这也会起作用,否则您将需要
*[.intersect$glosspath]
@TimC这与@MartinHonnen的调整一起起作用
*[.intersect$glosspath]
谢谢@MartinHonnen-我已经相应地修改了我的答案。
<xsl:template match="*[. intersect $glosspath]">
<xsl:number count="*[. intersect $apppath]" format="a" level="any"/>