为了将xml字符串值与多个字符串进行比较,我正在执行以下操作。
<xsl:if test="/Lines/@name = 'John' or /Lines/@name = 'Steve' or /Lines/@name = 'Marc' " >
任何人都可以告诉我,而不是在上面的情况下使用'或',如何使用xslt检查字符串是否存在于一组字符串中。
感谢。
答案 0 :(得分:21)
三种方法:
...
<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
。
<强>通知强>
这不是完全匹配字符串,而是正则表达式匹配,在您的情况下似乎是合适的。