2013-01-08 36 views
-1

嗨,我已经在XML应用CDATA到节点的sectio与"取代“所有<>&lt;&gt;更换。我想除了与&quot;更换"希望从XML

什么样的变化做我需要做的CDATA部分与&quot;

回答

1

更换"你不说清楚你在做什么,所以很难简单地回答。

如果你的意思是,

  • 您已经添加你喂养XSLT样式表的XML文档中的CDATA标记部分;
  • 其对应于在输入CDATA节的样式表的输出的部分具有向实体ltgt其中输入有尖括号(所以<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)您希望输出看起来像什么的样本。 (保持样本和代码简短 - 您想提供尽可能最小的完整工作示例,以便读者可以重新创建您的问题。)

+0

感谢McQueer。它符合我的目的:-) – shaiksha