-1

嗨,我已将 CDATA 应用于 xml 中的节点部分,所有<>都被替换为&lt;and &gt;。我想另外"替换&quot;

我需要对 CDATA 部分进行哪些更改以"替换&quot;

4

1 回答 1

1

你没有说清楚你在做什么,所以很难简单地回答。

如果你的意思是

  • 您在要提供给 XSLT 样式表的 XML 文档中添加了 CDATA 标记部分;
  • 与输入中的 CDATA 部分相对应的样式表输出部分具有对实体的引用,lt并且gt输入具有尖括号(因此<p class="greeting">Hello, world</p>变为&lt;p class="greeting"&gt;Hello, world!&lt;/p&gt;,这就是您想要的;和
  • 您希望 " 也不会出现在输出中,而是由对实体的引用替换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,'&quot;')">
        <xsl:variable name="sL" 
          select="substring-before($s,'&quot;')"/>
        <xsl:variable name="sR" 
          select="substring-after($s,'&quot;')"/>
        <xsl:value-of select="$sL"/>
        <xsl:text>&amp;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>&lt;p class=&amp;quot;greeting&amp;quot;&gt;Hello, 
world!&lt;/p&gt;</p>
</doc>

如果这不是您想要的,您可以尝试更详细地解释您的问题。在这种情况下,提供(a)当前代码的关键位,(b)示例输入,(c)您当前获得的输出示例,并描述它的问题总是一个好主意, 和 (d) 您希望输出看起来像的样本。(保持示例和代码简短——您希望提供尽可能最小的完整工作示例,以便读者可以重现您的问题。)

于 2013-01-09T02:23:41.433 回答