如何比较xslt中的多个字符串

时间:2011-06-15 11:43:20

标签: xml xslt

为了将xml字符串值与多个字符串进行比较,我正在执行以下操作。

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

任何人都可以告诉我,而不是在上面的情况下使用'或',如何使用xslt检查字符串是否存在于一组字符串中。

感谢。

6 个答案:

答案 0 :(得分:21)

三种方法:

  1. 使用竖线(或其他适当的字符)分隔字符串
  2. ...

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

    0.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>
    

    0.3。 在XSLT 2.0中与字符串序列进行比较

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

答案 1 :(得分:9)

仅限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>

答案 2 :(得分:4)

是的 - 我使用substring - 把你所有的名字都放在一个字符串中 - xsl:variable - 然后如果包含true,那么名字就在那里

e.g。

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


 <xsl:if test="contains($months,'feb')"> do stuff ...

答案 3 :(得分:3)

XPath有一个some $x in (1,2,..) satisfies $x>10表达式,可能对此有用。请参阅:http://www.java2s.com/Code/XML/XSLT-stylesheet/everyandsomeoperator.htm

答案 4 :(得分:1)

对于以空格分隔的单词,您可以使用index-of(tokenize("list of allowed", "\s+"), "needle"))match来使用正则表达式,但我非常确定有比这更聪明的内容。

答案 5 :(得分:1)

其他可能性:

XPath 2.0(XSLT 2.0)

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

XSLT 1.0 中,您有EXSLT提供的类似功能matches

<强>通知

这不是完全匹配字符串,而是正则表达式匹配,在您的情况下似乎是合适的。