Как сравнить с несколькими строками в xslt - PullRequest
14 голосов
/ 15 июня 2011

Для сравнения значения строки xml с несколькими строками я делаю следующее:

<xsl:if test="/Lines/@name = 'John' or /Lines/@name = 'Steve' or /Lines/@name = 'Marc' " >

Может ли кто-нибудь сказать мне, вместо использования 'или' в приведенном выше случае, как я могу проверить,строка существует в наборе строк с использованием xslt.

Спасибо.

Ответы [ 6 ]

21 голосов
/ 15 июня 2011

Три способа сделать это:

  1. Использовать строку (или другой соответствующий символ), разделенную строкой

...

 <xsl:template match=
  "Lines[contains('|John|Steve|Mark|',
                  concat('|', @name, '|')
                 )
         ]
  ">
     <!-- Appropriate processing here -->
 </xsl:template>

.2. Проверка на соответствие внешнему параметру .Если параметр не установлен извне, и мы используем XSLT 1.0, необходимо использовать функцию расширения xxx:node-set(), чтобы преобразовать его в обычный набор узлов, прежде чем обращаться к его дочерним элементам

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <!-- externally-specified parameter -->
 <xsl:param name="pNames">
  <n>John</n>
  <n>Steve</n>
  <n>Mark</n>
 </xsl:param>

 <xsl:template match="Lines">
  <xsl:if test="@name = $pNames/*">
     <!-- Appropriate processing here -->
    </xsl:if>
 </xsl:template>
</xsl:stylesheet>

.3. В XSLT 2.0 сравнить с последовательностью строк

 <xsl:template match="Lines[@name=('John','Steve','Mark')]">
     <!-- Appropriate processing here -->
 </xsl:template>
9 голосов
/ 15 июня 2011

Только XSLT 2.0: <xsl:if test="/Lines/@name = ('John', 'Steve', 'Marc')">

С XSLT 1.0 вы не можете написать литеральное выражение, представляющее последовательность строк или набор строк, но если вы знаете литеральные значения, вы можете создать наборузлов, например

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0"
  xmlns:data="http://example.com/data"
  exclude-result-prefixes="data">

  <data:data xmlns="">
    <value>John</value>
    <value>Steve</value>
    <value>Marc</value>
  </data:data>

  <xsl:variable name="values" select="document('')/xsl:stylesheet/data:data/value"/>

  <xsl:template match="...">
     <xsl:if test="/Lines/@name = $values">..</xsl:if>
  </xsl:template>

</xsl:stylesheet>
4 голосов
/ 15 июня 2011

Да - я использую подстроку - помещаю все ваше имя в строку - xsl: variable - тогда, если содержит true, имя там

например.

 <xsl:variable name="months">**janfebmaraprmajjunjulaugsepoktnovdec</xsl:variable>


 <xsl:if test="contains($months,'feb')"> do stuff ...
3 голосов
/ 15 июня 2011

XPath имеет выражение some $x in (1,2,..) satisfies $x>10, которое может быть полезно для этого. Смотри: http://www.java2s.com/Code/XML/XSLT-stylesheet/everyandsomeoperator.htm

1 голос
/ 15 июня 2011

Другая возможность:

XPath 2.0 (XSLT 2.0)

matches(/Lines/@name, 'John|Steve|Marc')

В XSLT 1.0 у вас есть аналогичная функция matchesпредоставляется EXSLT .

Уведомление

Это не точное совпадение со строкой, а регулярное выражение совпадение, которое в любом случае кажется уместным.

1 голос
/ 15 июня 2011

Для слов, разделенных пробелами, вы можете использовать index-of(tokenize("list of allowed", "\s+"), "needle")) или match для работы с регулярными выражениями, хотя я почти уверен, что есть что-то умнее этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...