使用xsl:when时在XSLT中测试条件

时间:2015-03-07 14:24:08

标签: xslt xslt-1.0

我有下面的xsl标签,其中我取出了fpml:periodMultiplier和fpml:period的值,如下所示...... xml中的标签是: -

<fpml:periodMultiplier>1</fpml:periodMultiplier>
<fpml:period>Y</fpml:period>

在xsl中提取如下所示

<Payindextenor>
<xsl:value-of select="../fpml:calculationPeriodDates
                        /fpml:calculationPeriodFrequency
                        /fpml:periodMultiplier" />
<xsl:value-of select="../fpml:calculationPeriodDates
                        /fpml:calculationPeriodFrequency
                        /fpml:period" />
</Payindextenor>

所以Payindextenor的价值是1Y

现在我想把null检查放在这个标签中,因为在下一个xml中可能没有fpml:periodMultiplier和fpml:period的值。

所以我想出了下面的xsl实现,其中我试过,如果任何值为null然后它应该打印null请建议它是正确的: -

<xsl:choose>
  <xsl:when test="../fpml:calculationPeriodDates
                    /fpml:calculationPeriodFrequency
                    /fpml:periodMultiplier
                  != ' ' 
                  and 
                  ../fpml:calculationPeriodDates
                    /fpml:calculationPeriodFrequency
                    /fpml:period 
                  != ' '">
    <xsl:value-of select="../fpml:calculationPeriodDates
                             /fpml:calculationPeriodFrequency
                            /fpml:periodMultiplier" />
   <xsl:value-of select="../fpml:calculationPeriodDates
                           /fpml:calculationPeriodFrequency
                           /fpml:period" />
  </xsl:when>
  <xsl:otherwise>
    <xsl:value-of select="'null'" />
  </xsl:otherwise>
</xsl:choose>

2 个答案:

答案 0 :(得分:2)

这与your previous question中的情况完全相同 - 您正在与包含单个空格的(非空)字符串' '进行比较,而实际需要的是检查空字符串。并且您可以使用我为该问题建议的相同解决方案,并使用normalize-space进行测试(将空字符串和仅包含空格的字符串视为“false”,将其他任何内容视为“true”):

<xsl:choose>
  <xsl:when test="normalize-space(../fpml:calculationPeriodDates
                    /fpml:calculationPeriodFrequency
                    /fpml:periodMultiplier)
                  and 
                  normalize-space(../fpml:calculationPeriodDates
                    /fpml:calculationPeriodFrequency
                    /fpml:period)">
    <xsl:value-of select="../fpml:calculationPeriodDates
                             /fpml:calculationPeriodFrequency
                            /fpml:periodMultiplier" />
   <xsl:value-of select="../fpml:calculationPeriodDates
                           /fpml:calculationPeriodFrequency
                           /fpml:period" />
  </xsl:when>
  <xsl:otherwise>
    <xsl:value-of select="'null'" />
  </xsl:otherwise>
</xsl:choose>

这将处理fpml:periodMultiplierfpml:period元素不存在的情况,以及它们存在但空的位置。

答案 1 :(得分:1)

正如Ian Roberts所说,将节点与单个空间进行比较与检查“null”非常不同,但假设当periodMultiplierperiod都为空时要显示“null” ,你可以这样做:

<xsl:variable name="freq" 
         select="../fpml:calculationPeriodDates/fpml:calculationPeriodFrequency" />
<xsl:choose>
  <xsl:when test="$freq/fpml:periodMultiplier != '' or 
                  $freq/fpml:period != ''">
    <xsl:value-of select="$freq/fpml:periodMultiplier" />
    <xsl:value-of select="$freq/fpml:period" />
  </xsl:when>
  <xsl:otherwise>
      <xsl:text>null</xsl:text>
  </xsl:otherwise>
</xsl:choose>