难以为XSL选择或制定条件

时间:2014-08-21 00:23:37

标签: xslt

我正在尝试使用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>

2 个答案:

答案 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])')">