使用XSL按顺序查找值

时间:2010-05-19 14:32:12

标签: xslt sequence xslt-2.0 functx

我想检查定义为

的序列中是否存在值
<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的不区分大小写的比较? TIA!

2 个答案:

答案 0 :(得分:3)

  

问题:什么是最好的方法   1)构建一个序列   小写字符串

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

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

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

或2)使案例不敏感   比较类似于$ value = $ seq   以上?

使用该策略,您可以定义一个自定义函数,用于比较lower-case()的{​​{1}}值和$value中的每个字符串值:

$seq

答案 1 :(得分:0)

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

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

参见Michael Kay的“XSLT 2.0和XPATH 2.0,4th ed”,p。 640

(我没有测试过这个)