标签可以直接输入
输出 <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>
如果A
和B
是相等的,你可以把它放到一个模板中
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>