我正在尝试使用XSL选择条件。在这里,我试图实现的是,当客户端向xp系统发送xml以下时。我的XSLT应查找匹配Pv(a)或Pv(b)或Pv(c)的值,如果其中任何一个被mactched,则发送到xsl中提到的后端url
否则 调用另一个名为"不要调用规则" (这不过是,选择名为error.xml的本地文件
感谢您的帮助
输入xml
<DownloadProfileChannels>
<DownloadProfileChannel>
<IntervalLength>60</IntervalLength>
<PulseMultiplier>0.025</PulseMultiplier>
<Category>Pv(a)</Category> <!-- for every Pv(a) or Pv(b) or Pv(c) -->
<TimeDataEnd>2014-02-20T08:00:00Z</TimeDataEnd>
<MedianValues>
<MedianValue>
<ChannelValue>9112</ChannelValue>
<ProfileStatuses i:nil="true" />
</MedianValue>
<MedianValue>
<ChannelValue>9096</ChannelValue>
<ProfileStatuses i:nil="true" />
</MedianValue>
<MedianValue>
<ChannelValue>9188</ChannelValue>
<ProfileStatuses i:nil="true" />
</MedianValue>
</MedianValue>
</MedianValues>
</DownloadProfileChannel>
</DownloadProfileChannels>
我的XSL
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dp="http://www.w3.org/1999/XSL/Format">
<xsl:template match="/">
<xsl:message dp:priority="debug"> Entered the XSL File </xsl:message>
</xsl:message>
<xsl:choose>
<xsl:when test="contains($Quantity,'Pv(a) or Pv(b)')">
<xsl:variable name="destURL"
select="http://backendurl.com"/>
<dp:set-variable name="'var://service/routing-url'"
value="$destURL"/>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="destURL"
select="local:///clienterror.xml"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:1)
这一行:
<xsl:when test="contains($Quantity,'Pv(a) or Pv(b)')">
检查$Quantity
是否包含文字字符串'Pv(a) or Pv(b)'
。您需要将这些分成两个检查:
<xsl:when test="contains($Quantity,'Pv(a)') or contains($Quantity,'Pv(b)')">
答案 1 :(得分:0)
首先,正如@Lego Stormtroopr所说,你需要将这两个条件分开。但是,我也不认为你真的想要一个&#34;包含&#34;在这里测试,你想要一个&#34; =&#34;测试。 contains函数将匹配Pv(a)(b)(c) - 任何具有Pv(a)作为子字符串的东西,而我认为你想匹配整个节点。所以它变成
<xsl:when test="$Quantity = 'Pv(a)' or $Quantity ='Pv(b)'">
,如果您使用的是XSLT 2.0,可以进一步缩写为
<xsl:when test="$Quantity = ('Pv(a)', 'Pv(b)')">
或者,在XSLT 2.0中,您可以使用正则表达式匹配:
<xsl:when test="matches($Quantity, 'Pv([ab])')">