如何在XSLT中实现“if else if else”条件

时间:2011-03-02 14:47:19

标签: xslt

是否有可能在xsl中实现“if else,if else”?例如,我有数据:

<document>
    <line>
        <name>MAR111</name>
        <value>1</value>
    </line>

    <line>
        <name>MAR111</name>
        <value>3</value>
    </line>
    <line>
        <name>MEA111</name>
        <value>1</value>
    </line>
    <line>
        <name>MPR111</name>
        <value>1</value>
    </line>
    <line>
        <name>MEA111</name>
        <value>4</value>
    </line>
    <line>
        <name>MPR111</name>
        <value>2</value>
    </line>
</document>

我需要获得三个具有三个名称的文档模板:

<document>
    <MAR>
        <name>MAR111</name>
        <number>1</number>
        <number>4</number>
    </MAR>
</document>
<document>
    <MEA>
        <name>MEA111</name>
        <number>1</number>
        <number>4</number>
    </MEA>
</document>
<document>
    <MPR>
        <name>MPR111</name>
        <number>1</number>
        <number>2</number>
    </MPR>
</document>

我尝试在应用模板上使用“选择,何时”,但也许有更好的方法:

<xsl:template match="/">
    <xsl:choose>
        <xsl:when test="/document/line/name='MEA111'">
            <xsl:apply-templates mode="MEA" select="/document"/>
        </xsl:when>
    </xsl:choose>
    <xsl:choose>
        <xsl:when test="/document/line/name='MPR111'">
            <xsl:apply-templates mode="MPR" select="/document"/>
        </xsl:when>
    </xsl:choose>
    <xsl:choose>
        <xsl:when test="/document/line/name='MAR111'">
            <xsl:apply-templates mode="MAR" select="/document"/>
        </xsl:when>
    </xsl:choose>
</xsl:template>

7 个答案:

答案 0 :(得分:26)

实际上你可以将它们合并在一起:

<xsl:template match="/">
    <xsl:choose>
        <xsl:when test="/document/line/name='MEA111'">
            <xsl:apply-templates mode="MEA" select="/document"/>
        </xsl:when>
        <xsl:when test="/document/line/name='MPR111'">
            <xsl:apply-templates mode="MPR" select="/document"/>
        </xsl:when>
        <xsl:when test="/document/line/name='MAR111'">
            <xsl:apply-templates mode="MAR" select="/document"/>
        </xsl:when>
    </xsl:choose>
</xsl:template>
编辑:Petras,在您澄清之后,似乎您想要的更容易:

<xsl:template match="/">
    <xsl:if test="/document/line/name='MEA111'">
       <xsl:apply-templates mode="MEA" select="/document"/>
    </xsl:if>
    <xsl:if test="/document/line/name='MPR111'">
        <xsl:apply-templates mode="MPR" select="/document"/>
    </xsl:if>
    <xsl:if test="/document/line/name='MAR111'">
        <xsl:apply-templates mode="MAR" select="/document"/>
    </xsl:if>
</xsl:template>

答案 1 :(得分:6)

最好的方法是使用单独的模板。

<xsl:template match="/document/line/name='MEA111'">
       <xsl:apply-templates mode="MEA" select="/document"/>
</xsl:template>

<xsl:template match="/document/line/name='MPR111'">
       <xsl:apply-templates mode="MPR" select="/document"/>
</xsl:template>

<xsl:template match="/document/line/name='MAR111'">
       <xsl:apply-templates mode="MAR" select="/document"/>
</xsl:template>

更少的线条,这更易于维护。

答案 2 :(得分:5)

不,choose when是说if else的xsl方式。没有更好的方法

答案 3 :(得分:2)

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="kLineByName" match="line" use="name"/>
    <xsl:template match="line[count(.|key('kLineByName',name)[1]) = 1]">
        <document>
            <xsl:element name="{substring(name,1,3)}">
                <xsl:copy-of select="name|key('kLineByName',name)/value"/>
            </xsl:element>
        </document>
    </xsl:template>
    <xsl:template match="text()"/>
</xsl:stylesheet>

输出:

<document>
    <MAR>
        <name>MAR111</name>
        <value>1</value>
        <value>3</value>
    </MAR>
</document>
<document>
    <MEA>
        <name>MEA111</name>
        <value>1</value>
        <value>4</value>
    </MEA>
</document>
<document>
    <MPR>
        <name>MPR111</name>
        <value>1</value>
        <value>2</value>
    </MPR>
</document>

答案 4 :(得分:2)

如果你想实现一个全面的堕落(例如相当于“其他”),你应该使用otherwise

答案 5 :(得分:1)

你的意思是:

<xsl:choose>
  <xsl:when test="name() = 'MAR111'">
    ... do something ...
  </xsl:when>
  <xsl:otherwise>
    ... do something as fallback ...
  </xsl:otherwise>
</xsl:choose>

BR Markus

答案 6 :(得分:0)

是的,我们可以使用<xsl:choose><xsl:when>来实现目标,但是如果,如果,条件也支持在不同xslt构造的@select属性中,例如:

<xsl:value-of select="if (@geography = 'North America') then 
                 'Domestic car'
                else if (@geography = 'Europe') then 
                  'Import from Europe'
                else if (@geography = 'Asia') then 
                  &quot;It's from Asia&quot;
                (: If it's anything else :)
                else 
                   'We don''t know!'"/>