2

次のように定義されたシーケンスに値が存在するかどうかを確認したい

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

過去に、私はPriscillaWalmsleys関数で成功しました。わかりやすくするために、ここでは次のように再現します。

<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!

4

2 に答える 2

3

質問:1)小文字の文字列のシーケンスを作成するための最良の方法は何ですか

XPATH2.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)"/>

MichaelKayの「XSLT2.0およびXPATH2.0、第4版」、p。640

(私はこれをテストしていません)

于 2010-06-29T19:16:57.470 に答える