使用禁用输出转义转换 XML 混合节点

Posted

技术标签:

【中文标题】使用禁用输出转义转换 XML 混合节点【英文标题】:Transforming XML mixed nodes with disable-output-escaping 【发布时间】:2010-11-23 01:03:28 【问题描述】:

已发布了有关此问题的变体,但我找不到任何解决基本情况的方法。我认为对问题的最简单版本有一个规范的答案会很好。这个问题假设 xslt 1.0。

我有一个包含混合节点的 XML 文档,例如:

这是一些 bold 的文本 这是一些斜体的。段>

我通常会使用如下所示的转换:

【问题讨论】:

你想让<bold>等出现转义还是不转义? 很抱歉没有说得更清楚。我希望文本被转义,但我希望能够继续匹配任何子节点(如粗体)。 【参考方案1】:

如果我理解正确,您希望文本节点以文字文本 (disable-output-escaping="yes") 的形式出现,但其余的转换应该正常工作(<bold><b> 等)

模板模式可以提供帮助:

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
  <xsl:output method="xml" encoding="utf-8" omit-xml-declaration="yes" />

  <xsl:template match="paragraph">
    <p>
      <xsl:apply-templates mode="literal" />
    </p>
  </xsl:template>

  <!-- literal templates (invoked in literal mode) -->
  <xsl:template match="bold" mode="literal">
    <b><xsl:apply-templates mode="literal"/></b>
  </xsl:template>
  <xsl:template match="italic" mode="literal">
    <i><xsl:apply-templates mode="literal"/></i>
  </xsl:template>
  <xsl:template match="text()" mode="literal">
    <xsl:value-of select="." disable-output-escaping="yes" />
  </xsl:template>

  <!-- normal templates (invoked when you don't use a template mode) -->
  <xsl:template match="bold">
    <b><xsl:apply-templates /></b>
  </xsl:template>
  <xsl:template match="italic">
    <i><xsl:apply-templates /></i>
  </xsl:template>

</xsl:stylesheet>

【讨论】:

以上是关于使用禁用输出转义转换 XML 混合节点的主要内容,如果未能解决你的问题,请参考以下文章

在哪里为共享点列表添加禁用输出转义?

如何使用 XSL 转义 XML 内容以安全地将其输出为 JSON?

模式不输出预期节点数据的命名模板

XSLT - 如何将节点内的内联/转义 XML 视为嵌套节点

XSLT 转换从混合内容中删除 HTML 元素

python学习1(类型输入输出转义字符转换)