使用XSLT逻辑进行XML转换

时间:2017-11-23 14:32:39

标签: xml xslt

假设我有一个带结构的XML(来自大型XML的片段):

<refbody>
<question>test</question>
<answer>test</answer>
</refbody>

XSLT应将questionanswer放在单独的<p>标记中。为此,我正在使用下面的XSLT。

是否有更优雅的方法,而不是写两个xsl:template?可以使用一个xsl:templatexsl: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>

2 个答案:

答案 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用户总是会优先选择单独的模板规则。它为您提供了更好的模块化:您的代码对源代码文档结构或渲染要求中的更改更具弹性。