可以通过直接输入
输出标签 <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
答案 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>
如果A
和B
相等,您可以将其放入模板中。
答案 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>