Найти значение в последовательности, используя XSL - PullRequest
2 голосов
/ 19 мая 2010

Я хочу проверить, существует ли значение в последовательности, определенной как

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

В прошлом у меня был успех с Присциллой Уолмсли функция . Для ясности я воспроизвожу это здесь следующим образом:

<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 выше? ТИА!

Ответы [ 2 ]

3 голосов
/ 24 января 2011

Вопрос: как лучше всего либо 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>
0 голосов
/ 29 июня 2010

Используйте «для выражения» внутри функции, чтобы подготовить строчную версию последовательности

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

См. Майкл Кей «XSLT 2.0 и XPATH 2.0, 4-е издание», с.640

(я не проверял это)

...