我想检查定义为
的序列中是否存在值<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
包装$seq
和lower-case()
。显然,这没有多大帮助,因为$seq
是一个序列而lower-case()
只接受字符串。
问题:1)构造小写字符串序列的最佳方法是什么,或者2)进行类似于上面$value=$seq
的不区分大小写的比较? TIA!
答案 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
(我没有测试过这个)