如何对元素 XSL 进行两次转换

How make two transformations for an element XSL

我正在学习 XSL,如果可能的话,我希望一个元素可以进行 2 次转换。

这是元素:

<xsl:template match="//ns:text[@type='TEXT']">
    <xsl:call-template name="break"/>
  </xsl:template>

这是第一个转换和一段代码:

<xsl:template name="break">

    <xsl:param name="text" select="string(.)"/>
    <xsl:choose>
      <xsl:when test="contains($text, '&#xa;')">
        <xsl:if test="substring-before($text, '&#xa;') != ''">
          <p>
            <xsl:value-of select="substring-before($text, '&#xa;')"/>
          </p>
        </xsl:if>
        <xsl:call-template name="break">
          <xsl:with-param name="text" select="substring-after($text, '&#xa;')"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <p>
          <xsl:value-of select="$text"/>
        </p>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

对于第二次转换,我想用translate()方法替换一些字符。

但是,请问,我该怎么做才能使用 break call-template 离开第一个转换,同时将 translate ?

在此先感谢您的帮助,

此致。

我认为执行翻译的最有效点是在调用分词模板时——这样调用看起来像这样:

<xsl:template match="ns:text[@type='TEXT']">
    <xsl:call-template name="break">
        <xsl:with-param name="text" select="translate(., 'abc', 'xyz')"/>
    </xsl:call-template>
</xsl:template>

然后,在调用的模板中,您需要更改:

<xsl:param name="text" select="string(.)"/>

至:

<xsl:param name="text"/>

虽然如果你不这样做,它应该也能正常工作。

或者,您可以修改标记化模板,使其仅在一个地方写入输出(参见示例 )。然后在此时执行翻译。


未测试,因为没有提供测试示例。