Найти значение в последовательности, используя 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
(Я не проверял это)