2011-09-26 5 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> 

는 원하는 생산, 정확한 레울 t :

<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 : 환영합니다. –

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 문자 길다는 것입니다. 그것은'# '이 아니라'\ "입니다. –

관련 문제