在同一xpath上进行多次测试时合并XSL

时间:2014-01-21 19:18:00

标签: xml xslt

考虑到:

<xsl:choose>
    <xsl:when test="/XmlOutput/CurrentController/conCategory/aField/contentId!=8 
        and /XmlOutput/CurrentController/conCategory/aField/contentId!=16 
        and /XmlOutput/CurrentController/conCategory/aField/contentId!=17 
        and /XmlOutput/CurrentController/conCategory/aField/contentId!=18 
        and /XmlOutput/CurrentController/conCategory/aField/contentId!=19 
        and /XmlOutput/CurrentController/conCategory/aField/contentId!=20 
        and /XmlOutput/CurrentController/conCategory/aField/contentId!=21">
        <xsl:call-template name="foo" />
    </when>
</choose>

我如何将这些组合成更简洁的测试?

2 个答案:

答案 0 :(得分:4)

如果您使用的是XSLT 2.0,则可以使用序列:

<xsl:choose>
    <xsl:when test="/XmlOutput/CurrentController/
        conCategory/aField/not(contentId = (8,16 to 21))">
        <xsl:call-template name="foo"/>
    </xsl:when>
    <xsl:otherwise>
        <!--tbd-->
    </xsl:otherwise>
</xsl:choose>

在此示例中,测试位于contentId中的所有/XmlOutput/CurrentController/conCategory/aField元素上。此外,contentId必须是一个数字。

答案 1 :(得分:1)

以下内容对我来说很有效,可以整理表达方式:

<xsl:variable name="cid" select="/XmlOutput/CurrentController/conCategory/aField/contentId"/>
<xsl:choose>
    <xsl:when test="$cid!=8 
        and $cid!=16 
        and $cid!=17 
        and $cid!=18 
        and $cid!=19 
        and $cid!=20 
        and $cid!=21">
        <xsl:call-template name="foo" />
    </xsl:when>
</xsl:choose>