2

我想检查一个值是否存在于定义为的序列中

<xsl:variable name="some_seq" select="/root/word[@optional='no']/text()"/>

过去,我在 Priscilla Walmsleys function方面取得了成功。为了清楚起见,我在这里复制如下:

<xsl:function name="functx:is-value-in-sequence" as="xs:boolean">
    <xsl:param name="value" as="xs:anyAtomicType?"/>
    <xsl:param name="seq" as="xs:anyAtomicType*"/>
    <xsl:sequence select="$value=$seq"/>
</xsl:function>

但是,这一次我需要进行不区分大小写的比较,因此我尝试将$value和都$seqlower-case(). 显然,这并没有多大帮助,因为$seq它是一个序列并且lower-case()只接受字符串。

问题:1)构造小写字符串序列或 2)进行类似于$value=$seq上述的不区分大小写比较的最佳方法是什么?蒂亚!

4

2 回答 2

3

问题:1)构造小写字符串序列的最佳方法是什么

没有多少人意识到您可以使用函数作为 XPATH 2.0 表达式中的最后一个定位步骤。

您可以使用此表达式创建一系列lower-case()字符串值:

/root/word[@optional='no']/text()/lower-case(.)

或 2) 进行类似于上面 $value=$seq 的不区分大小写的比较?

使用该策略,您可以定义一个自定义函数,该函数将 的lower-case()值与 中的$value每个字符串值进行比较$seq

<xsl:function name="functx:is-value-in-sequence" as="xs:boolean">
    <xsl:param name="value" as="xs:anyAtomicType?"/>
    <xsl:param name="seq" as="xs:anyAtomicType*"/>
    <xsl:sequence select="some $word in $seq/lower-case(.) 
                               satisfies ($word = $value/lower-case(.))"/>
</xsl:function>
于 2011-01-24T02:20:22.710 回答
0

在函数内部使用“for-expression”来准备序列的小写版本

<xsl:variable name="lcseq" select="for $i in $seq return lower-case($i)"/>

请参阅 Michael Kay 的“XSLT 2.0 和 XPATH 2.0,第 4 版”,第 3 页。640

(我没有测试过这个)

于 2010-06-29T19:16:57.470 回答