如何有条件地输出标签?

时间:2014-05-11 06:27:02

标签: xslt xslt-1.0

可以通过直接输入

输出标签
  <div>
    <span>complex...</span>
  </div>

或使用<xsl:element>

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

我的问题是如何执行此操作:当x,输出<div>,当y,输出<a>,当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

3 个答案:

答案 0 :(得分:1)

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相等,您可以将其放入模板中。

答案 1 :(得分: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 :(得分:0)

XSLT不输出标签:它将节点输出到结果树。因此,您使用像<![CDATA[ </div> ]]>这样的结构的建议是不合适的:您无法将半个节点添加到树中。

然而,条件生成元素节点没有困难。如果要创建元素但有条件地计算其名称,则可以在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>