如何用XSLT中的字符串'\''替换双引号?

问题描述:

我有一个XML,其中双引号应该用字符串\“替换。如何用XSLT中的字符串'''替换双引号?

如:<root><statement1><![CDATA[<u>teset "message"here</u>]]></statement1></root>

所以输出应该是<root><statement1><![CDATA[<u>teset \"message\"here</u>]]></statement1></root>

任何人能解释如何做到这一点?

I. XSLT 1.0溶液

该转化

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes" 
cdata-section-elements="statement1"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="pPattern">"</xsl:param> 
<xsl:param name="pReplacement">\"</xsl:param> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="statement1/text()" name="replace"> 
    <xsl:param name="pText" select="."/> 
    <xsl:param name="pPat" select="$pPattern"/> 
    <xsl:param name="pRep" select="$pReplacement"/> 

<xsl:choose> 
    <xsl:when test="not(contains($pText, $pPat))"> 
    <xsl:copy-of select="$pText"/> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:copy-of select="substring-before($pText, $pPat)"/> 
    <xsl:copy-of select="$pRep"/> 
    <xsl:call-template name="replace"> 
    <xsl:with-param name="pText" select= 
     "substring-after($pText, $pPat)"/> 
    <xsl:with-param name="pPat" select="$pPat"/> 
    <xsl:with-param name="pRep" select="$pRep"/> 
    </xsl:call-template> 
    </xsl:otherwise> 
</xsl:choose> 
</xsl:template> 
</xsl:stylesheet> 

当所提供的XML文档施加:

<root> 
    <statement1><![CDATA[<u>teset "message"here</u>]]></statement1> 
</root> 

产生想要的,正确的结果牛逼

<root> 
    <statement1><![CDATA[<u>teset \"message\"here</u>]]></statement1> 
</root> 

II。 XSLT 2.0溶液

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xsl:output omit-xml-declaration="yes" indent="yes" 
cdata-section-elements="statement1"/> 

<xsl:param name="pPat">"</xsl:param> 
<xsl:param name="pRep">\\"</xsl:param> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

    <xsl:template match="statement1/text()"> 
    <xsl:sequence select="replace(.,$pPat, $pRep)"/> 
    </xsl:template> 
</xsl:stylesheet> 

当在相同的XML文档(如上述)施加,相同的正确的结果产生

<root> 
     <statement1><![CDATA[<u>teset \"message\"here</u>]]></statement1> 
</root> 
+0

谢谢你的工作... –

+0

@ user833985:不客气。 –

<?xml version='1.0' ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:fo="http://www.w3.org/1999/XSL/Format" 
       version='1.0'> 
<xsl:output method="xml"/> 

<xsl:template match="/"> 
    <xsl:for-each select="//p"> 
    <xsl:value-of select="translate(text(), '&amp;x22;','#')"/> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

它为我...

+0

问题是替换字符串是两个字符长。 –

+0

您所看到的是引号的转义序列 - 然后我使用了散列标记。这将说明 - 你可以做到这一点 - 即使混合转义序列与符号:) – Mike

+1

正如我所说的,问题是,替换字符串是两个字符长。它是'''',而不是'#'。 –