XSLT converting style down from 3.0 to 2.0 - varia

2019-07-22 06:18发布

I have a large XSL 3.0 stylesheet which I need to convert to XSL 2.0. It seems there is one error repeated throughout the document, but I'm not sure how to fix it.

For example, in XSL 3.0 I declare these variables:

<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']"/> 

And then I use these variables in a variety of contexts such as

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

or:

<xsl:number count="$apppath" format="a" level="any"/>

The variables all throw the same error: XTSE0340 XSLT Pattern syntax error at char 0 on line 635 in {$glosspath}: A variable reference is not allowed in an XSLT pattern (except in a predicate)

I've looked at various answers on the site like this and at the guidelines, but I'm not sure how to re-write this to be compliant...

Many thanks in advance.

1条回答
We Are One
2楼-- · 2019-07-22 06:44

I believe for your template match you can do this...

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

And for the number, you can do this (although this is not necessarily as efficient)

<xsl:number count="*[. intersect $apppath]" format="a" level="any"/>

EDIT: Changed to use intersect. Thanks to Martin Honnen

查看更多
登录 后发表回答