2011-09-26 12 views
1

二重引用符を\"という文字列に置き換えるXMLがあります。二重引用符をXSLTの文字列 ' "'に置き換える方法

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

ので、出力は<root><statement1><![CDATA[<u>teset \"message\"here</u>]]></statement1></root>

誰もがこれを達成するためにどのように説明できなければなりませんか?

答えて

3

I.のXSLT 1.0ソリューション

この変換:提供されるXML文書に適用

<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> 

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

募集を生成し、正しいレスルトン

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

II。 XSLT 2.0ソリューション:(上記のように)同じXML文書に適用されたとき

<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> 

、同じ正しい結果がが生成されます

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

ありがとうございました... –

+0

@ user833985:どうぞよろしくお願いいたします。 –

0
<?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

問題は、置換文字列が2文字長いことです。 –

+0

あなたが見ているのは、引用符のエスケープシーケンスです - それから私はハッシュマークを使いました。これは、あなたがこれを行うことができることを示しています - 記号でエスケープシーケンスを混ぜることさえできます:) – Mike

+1

私が言ったように、問題は置換文字列が2文字長いことです。それは '# 'ではなく' \ "です。 –

関連する問題