想要从xml中替换“with”

时间:2013-01-08 14:23:48

标签: xml xslt-1.0

您已将CDATA应用于xml中的节点,所有<>都替换为&lt;&gt;。我想将"替换为&quot;

我需要对CDATA部分进行哪些更改才能将"替换为&quot;

1 个答案:

答案 0 :(得分:1)

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

如果你的意思是那个

  • 您已在XML文档中添加了CDATA标记的部分,并将其提供给XSLT样式表;
  • 样式表输出中与输入中的CDATA部分对应的部分引用了实体ltgt,其中输入具有尖括号(因此<p class="greeting">Hello, world</p>变为{{ 1}},这就是你想要的;
  • 您希望“不会在输出中出现字面意思,而是替换为对实体的引用&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>

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