如何有条件地输出标记



标签可以直接输入

输出
  <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属性的值?

I try this, failed:

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

[已编辑]忘了说,只有XSLT1.0

从另一个角度来看:

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

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是相等的,你可以把它放到一个模板中

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>

相关内容

  • 没有找到相关文章

最新更新