嗨,我已将 CDATA 应用于 xml 中的节点部分,所有<
和>
都被替换为<
and >
。我想另外"
替换"
。
我需要对 CDATA 部分进行哪些更改以"
替换"
你没有说清楚你在做什么,所以很难简单地回答。
如果你的意思是
lt
并且gt
输入具有尖括号(因此<p class="greeting">Hello, world</p>
变为<p class="greeting">Hello, world!</p>
,这就是您想要的;和quot
那么实现目标的一种方法是编写一个模板来处理文本节点,该模板测试“是否存在”,将文本节点拆分为第一个“的左侧和右侧”,写出左侧部分,写出一个&符号,写出quot;
,然后使用字符串的正确部分递归调用自身。
以下样式表说明了该模式:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="doc">
<xsl:element name="doc">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="text()" name="escape-quot">
<xsl:param name="s" select="."/>
<xsl:choose>
<xsl:when test="contains($s,'"')">
<xsl:variable name="sL"
select="substring-before($s,'"')"/>
<xsl:variable name="sR"
select="substring-after($s,'"')"/>
<xsl:value-of select="$sL"/>
<xsl:text>&quot;</xsl:text>
<xsl:call-template name="escape-quot">
<xsl:with-param name="s" select="$sR"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$s"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
我们可以将其应用于以下输入以查看结果:
<doc>Hi. This is a test.
<![CDATA[<p class="greeting">Hello,
world!</p>]]>
</doc>
我得到的结果是,我猜想,你在找什么。
<?xml version="1.0"?>
<doc><p>Hi. This is a test.</p>
<p><p class=&quot;greeting&quot;>Hello,
world!</p></p>
</doc>
如果这不是您想要的,您可以尝试更详细地解释您的问题。在这种情况下,提供(a)当前代码的关键位,(b)示例输入,(c)您当前获得的输出示例,并描述它的问题总是一个好主意, 和 (d) 您希望输出看起来像的样本。(保持示例和代码简短——您希望提供尽可能最小的完整工作示例,以便读者可以重现您的问题。)