使用禁用输出转义转换 XML 混合节点
Posted
技术标签:
【中文标题】使用禁用输出转义转换 XML 混合节点【英文标题】:Transforming XML mixed nodes with disable-output-escaping 【发布时间】:2010-11-23 01:03:28 【问题描述】:已发布了有关此问题的变体,但我找不到任何解决基本情况的方法。我认为对问题的最简单版本有一个规范的答案会很好。这个问题假设 xslt 1.0。
我有一个包含混合节点的 XML 文档,例如:
这是一些我通常会使用如下所示的转换:
模板> 模板> 模板>在我想使用 disable-output-escaping="yes" 之前效果很好,这是 xsl:value-of 的一个属性。有没有办法选择混合节点的文本部分,我可以独立于嵌入节点应用 value-of?
这当然行不通,因为我会丢失子节点:
我知道我正在尝试执行此操作的事实可能代表了我处理 XML 的方式中的一个固有问题,但是大部分 XML 是由(受信任的)用户输入相当天真地生成的,我正在尝试避免 XML->XSLT->html 表单之间的大量额外处理代码(如果可能的话)。
【问题讨论】:
你想让<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?