假设我有一个带结构的XML(来自大型XML的片段):
<refbody>
<question>test</question>
<answer>test</answer>
</refbody>
XSLT应将question
和answer
放在单独的<p>
标记中。为此,我正在使用下面的XSLT。
是否有更优雅的方法,而不是写两个xsl:template
?可以使用一个xsl:template
和xsl:if
来完成吗?我尝试的时候没用。
XSLT:
<xsl:template match="question">
<p>
<b><xsl:apply-templates/></b>
</p>
</xsl:template>
<xsl:template match="refbody | answer">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
产生输出:
<p class='refbody'>
<p class='question'><b>test</b></p>
<p class='answer'>test</p>
</p>
将上述内容合并为一个xsl:template
不起作用:
<xsl:template match="refbody | answer | question">
<xsl:choose>
<xsl:when test="question">
<p><b><xsl:apply-templates/></b></p>
</xsl:when>
<xsl:when test="refbody|answer">
<p><xsl:apply-templates/></p>
</xsl:when>
</xsl:choose>
</xsl:template>
答案 0 :(得分:1)
除了考虑或多或少优雅之外,您正在寻找的解决方案可能是这样的:
<xsl:template match="refbody | answer | question">
<p>
<xsl:choose>
<xsl:when test="self::question">
<b><xsl:apply-templates/></b>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates/>
</xsl:otherwise>
</xsl:choose>
</p>
</xsl:template>
答案 1 :(得分:0)
如果你认为使用xsl:choose
比使用两个模板规则更优雅,我必须告诉你,你错了。有经验的XSLT用户总是会优先选择单独的模板规则。它为您提供了更好的模块化:您的代码对源代码文档结构或渲染要求中的更改更具弹性。