单个xsl:when中有多个xsl:choose

6

如果我正在测试几个不同的定义参数,我能否在一个语句中调用多个语句?例如:

<parameters>
                    <param id="1">
                        <key>Load</key>
                        <value>XML</value>
                    </param>
                    <param id="2">
                        <key>Input</key>
                        <value>Http</value>
                    </param>
                    <param id="3">
                        <key>Response</key>
                        <value>Y</value>
                    </param> 
</parameters> 

我能用一个来调用三个不同的吗?因为我将有几个带有不同的,这些值稍后需要调用不同的模板。

好问题(+1)。请看我的答案,有一个不同的方法。 - Dimitre Novatchev
2个回答

8

是的,当然可以。您还可以添加一个xsl:otherwise节点来处理所有其他情况:

<xsl:choose>
    <xsl:when test="param/@id = '1'">
        <xsl:text>XML</xsl:text>
    </xsl:when>
    <xsl:when test="param/@id = '2'">
        <xsl:text>HTTP</xsl:text>
    </xsl:when>
    <xsl:when test="param/@id = '3'">
        <xsl:text>Y</xsl:text>
    </xsl:when>
    <xsl:otherwise>
        <xsl:text>Other format</xsl:text> 
    </xsl:otherwise>
</xsl:choose>

这类似于C语言、Java中的switch语句或VB中的Select Case语句。当然,您可以检查任意XPath表达式,例如您也可以检查


<xsl:when test="param/key = 'Input'">
    <!-- handle input -->
</xsl:when>

5
每个 xsl:when 是否彼此独立?如果三个测试都为真,那么只选择第一个吗? - austinmarton
1
是的,它们是互斥的 - 请参考https://stackoverflow.com/questions/18742988/when-to-use-xslif-and-when-to-use-xslchoose-xslwhen-in-xslt(Damien_The_Unbeliever的答案)。第一个匹配将被应用。 - JFFIGK

3

我可以用一个单一的调用来检查三个不同的,因为我将有几个带有不同参数的调用,这些调用将在以后需要帮助调用不同的模板。

是的,您可以,@0xA3已经向您展示了如何操作。

但您不需要这样做,也不应该这样做!

XSLT 的精神是 XSLT 处理器可以根据条件决定应用哪个模板。

以下是转换内容:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="param[@id=1]">
    Load!
 </xsl:template>

 <xsl:template match="param[@id=2]">
    Input!
 </xsl:template>

 <xsl:template match="param[@id=3]">
    Response!
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档时:

<parameters>
    <param id="1">
        <key>Load</key>
        <value>XML</value>
    </param>
    <param id="2">
        <key>Input</key>
        <value>Http</value>
    </param>
    <param id="3">
        <key>Response</key>
        <value>Y</value>
    </param>
</parameters>

产生:

<parameters>
    Load!

    Input!

    Response!
 </parameters>

请注意,我们没有使用任何条件逻辑--XSLT处理器本身决定了哪个模板应用于具有不同id属性的元素。
这是一个很棒的功能(在这个具体的情况下,您节省了14行容易出错的代码),建议尽可能经常使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接