2010-05-19 4 views
1

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

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

В прошлом, я имел успех с Присциллой 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 выше? ТИА!

+0

Вы используете XSLT1 или 2? –

+0

Я использую XSLT2. – conciliator

ответ

1

Вопрос: что это лучший способ либо 1) построить последовательность строчными строк

Не многие люди понимают, что вы можете использовать функцию как последний шаг местоположения в выражении XPATH 2.0.

Вы можете создать последовательность lower-case() строковых значений с этим выражением:

/root/word[@optional='no']/text()/lower-case(.) 

или 2) сделать регистронезависимые сравнения аналогичного значения $ = $ SEQ выше?

Используя эту стратегию, вы можете определить пользовательскую функцию, которая сравнивает значение $valuelower-case() и каждое значение строки в $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

О, мне это нравится! Не знал, что я мог бы вызвать функцию нижнего регистра(), подобную этому, хотя это имеет большой смысл. +1 – conciliator

0

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

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

знакомства Майкла Кея «XSLT 2.0 и XPath 2.0, 4-е изд», стр. 640

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

+0

спасибо за ответ и извините за задержку, человек. Я работал вокруг этого довольно долгое время перед вашим ответом, и теперь, когда ответ Мэдса снова привлек мое внимание к теме, я собираюсь пойти на его решение, поскольку это было немного более конкретным. Спасибо за усилия, хотя! – conciliator