使用 xsl:when 在 XSLT 中测试条件
Testing conditions in XSLT with xsl:when
我有下面的 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
现在我想在此标记中进行空检查,因为可能会发生在即将到来的 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>
正如 Ian Roberts 所说,将一个节点与单个 space 进行比较与检查 "null" 有很大不同,但假设您想在两个 [=11] 时都显示 "null" =]和period
为空,可以这样做:
<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>
这与 your previous question 中的情况完全相同 - 您正在与包含单个 space 的(非空)字符串 ' '
进行比较,而您真正想要的是是检查空字符串。您可以使用我针对该问题建议的相同解决方案,并使用 normalize-space
进行测试(它将空字符串和仅包含 whitespace 的字符串视为 "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:periodMultiplier
或 fpml:period
元素不存在以及它们存在但为空的情况。
我有下面的 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
现在我想在此标记中进行空检查,因为可能会发生在即将到来的 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>
正如 Ian Roberts 所说,将一个节点与单个 space 进行比较与检查 "null" 有很大不同,但假设您想在两个 [=11] 时都显示 "null" =]和period
为空,可以这样做:
<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>
这与 your previous question 中的情况完全相同 - 您正在与包含单个 space 的(非空)字符串 ' '
进行比较,而您真正想要的是是检查空字符串。您可以使用我针对该问题建议的相同解决方案,并使用 normalize-space
进行测试(它将空字符串和仅包含 whitespace 的字符串视为 "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:periodMultiplier
或 fpml:period
元素不存在以及它们存在但为空的情况。