【问题标题】:如何对元素 XSL 进行两次转换
【发布时间】:2022-01-22 08:10:27
【问题描述】:

我正在学习 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

提前感谢您的帮助,

最好的问候。

【问题讨论】:

  • 请发布minimal reproducible example 显示输入、可执行的 XSLT 样式表和预期结果。还要说明您的处理器支持哪个 XSLT 版本。

标签: templates xslt transformation


【解决方案1】:

我相信执行翻译的最有效点是在调用标记化模板时 - 这样调用看起来像:

<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"/>

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

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


未经测试,因为没有提供用于测试的示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-16
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多