【问题标题】:How to conditionally output tags?如何有条件地输出标签?
【发布时间】:2014-05-11 06:27:01
【问题描述】:

标签可以直接输入输出

  <div>
    <span>complex...</span>
  </div>

或使用&lt;xsl:element&gt;

  <xsl:element name="div">
    <span>complex...</span>
  </xsl:element>

我的问题是如何做到这一点:当x时,输出&lt;div&gt;,当y时,输出&lt;a&gt;,当z时,不输出标签

一个当然可以做三个模板,甚至可以写出丑陋的代码为

<xsl:when ...x >
    <![CDATA[ <div>  ]]> 
</xsl:when>

<span>complex...</span>

<xsl:when ...x >
    <![CDATA[ </div>  ]]> 
</xsl:when>

但是有没有办法有条件地提供 xsl:element 的 name 属性的值?

我试过了,失败了:

<xsl:variable name="a" select="'div'"/>
<xsl:element name="$a">
...

[已编辑] 忘了说,仅限 XSLT1.0

【问题讨论】:

标签: xslt xslt-1.0


【解决方案1】:

这是另一种看待它的方式:

<xsl:variable name="content">
    <span>complex...</span>
</xsl:variable>

<xsl:choose>
    <xsl:when ... x>
        <div>
            <xsl:copy-of select="$content"/>
        </div>
    </xsl:when>
    <xsl:when ... y>
        <a>
            <xsl:copy-of select="$content"/>
        </a>
    </xsl:when>
    <xsl:when ... z>
        <xsl:copy-of select="$content"/>
    </xsl:when>
</xsl:choose>

【讨论】:

    【解决方案2】:

    name 属性不需要完整的 XPath 表达式,而只是一个字符串。因此,不必使用name="$a",您只需要用花括号将 Xpath 表达式计算为字符串:

    <xsl:element name="{$a}">
    

    至于周围标签的条件创建,你可以这样做:

    <xsl:variable name="tag_name">
      <xsl:choose>
        <xsl:when test="x">
          <xsl:text>div</xsl:text>
        </xsl:when>
        <xsl:when test="y">
          <xsl:text>a</xsl:text>
        </xsl:when>
      </xsl:choose>
    
      <!-- possibly other checks for different tag names -->
    
    <xsl:variable>
    
    <xsl:choose>
      <xsl:when test="$tag_name != ''">
         <xsl:element name="$tag_name">
    
           <!-- whatever has to be put into a tagged block (A) -->
    
         </xsl:element>
      </xsl:when>
    
      <xsl:otherwise>
    
         <!-- whatever has to be put into a untagged block (B) -->
    
      </xsl:otherwise>
    
    </xsl:choose>
    

    如果AB 相等,您可以将其放入模板中。

    【讨论】:

    • 适用于“当 x 时,输出 &lt;div&gt;,当 y 时,输出 &lt;a&gt;”。你知道“当z时,不输出标签”怎么办吗?
    • 查看我的更新答案。另一种可能更优雅的处理方式是使用具有不同模式的匹配模板。你会对此感兴趣吗?不过,如果您目前没有使用匹配模板,它可能会导致您的整体 XSLT 发生更深刻的变化。
    • @MarcusRickert 你能看看stackoverflow.com/questions/69207608/…
    【解决方案3】:

    XSLT 不输出标签:它将节点输出到结果树。因此,您对使用 &lt;![CDATA[ &lt;/div&gt; ]]&gt; 之类的结构的建议是不合时宜的:您不能将半个节点添加到树中。

    但是,有条件地生成元素节点并不困难。如果您想创建一个元素但有条件地计算其名称,那么在 XSLT 2.0 中您可以这样做

    <xsl:element name="{if (test) then 'a' else 'b'}">
    

    或者如果你被 1.0 卡住了,那就更冗长了

    <xsl:variable name="elname">
      <xsl:choose>
        <xsl:when test="test">a</xsl:when>
        <xsl:otherwise>b</xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <xsl:element name="{$elname}"/>
    

    如果你想根据条件输出一个元素或什么都不输出,就这样做

    <xsl:if test="test2">
      <e/>
    </xsl:if>
    

    【讨论】:

    • 如何在&lt;span&gt;complex...&lt;/span&gt;中有条件地输出一个元素或任何内容?
    • xsl:if 的内容不需要像我的示例中那样是单个文字结果元素,它们可以是任何指令。
    猜你喜欢
    • 2011-10-19
    • 2016-09-03
    • 2022-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多