Найти значение в последовательности, используя XSL

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

<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 ответа

Решение

Вопрос: как лучше 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>

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

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

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

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

Другие вопросы по тегам