【问题标题】:Multiple xsl:choose within a single xsl:when多个 xsl:在单个 xsl 中选择:when
【发布时间】:2010-06-30 15:33:02
【问题描述】:

如果我正在测试几个不同的定义参数,我可以在xsl:choose 语句中调用多个xsl:when 语句吗?所以如果我有:

<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> 

我可以用一个&lt;xsl:choose&gt; 调用三个不同的&lt;xsl:when&gt; 来检查吗,因为我将有几个&lt;param&gt; 和不同的&lt;value&gt;,以后需要帮助调用不同的模板。

【问题讨论】:

  • 好问题 (+1)。请参阅我的答案以了解不同的方法。

标签: xml xslt


【解决方案1】:

是的,当然可以。您还可以添加一个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>

【讨论】:

  • 每个 是互斥的吗?那么如果所有三个测试都为真,那么只会选择第一个吗?
  • 是的,它们是互斥的——请参阅stackoverflow.com/questions/18742988/…(Damien_The_Unbeliever 的回答)。第一场比赛将适用。
【解决方案2】:

我可以叫三个不同的吗 与单 检查因为我会有 几个不同的 以后需要帮忙打电话 不同的模板。

是的,你可以,@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 属性的&lt;param&gt; 元素应用哪个模板。

这是一个很棒的工具(在这个具体案例中,您保存了 14 行容易出错的代码),建议尽可能多地使用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 2020-10-27
    相关资源
    最近更新 更多