2013-04-11 31 views
1

我想在XSLT中獲得此信息。這可能嗎?是否可以在XSLT中將整個源XML作爲CDTA獲取?

源XML

<Parent> 
    <Child></Child> 
    <Child></Child> 
    <Child></Child> 
    <Child></Child> 
</Parent> 

輸出XML

<Issue> 
    <Node1>Something happening here</Node1> 
    <Node2>Something happening here</Node2> 
<Node3><![CDATA[ 
<Parent> 
     <Child></Child> 
     <Child></Child> 
     <Child></Child> 
     <Child></Child> 
    </Parent> 
]]> 
</Issue> 

我想整個輸入XML作爲<Node3>

CDATA這可能嗎?

我的XSLT看起來像下面(摘錄)

<xsl:template match="/"> 

     <xsl:call-template name="Issue"/> 
    </xsl:template> 

    <xsl:template name="Issue"> 
     <xsl:call-template name="Node1"/> 
     <xsl:call-template name="Node2"/> 
     <xsl:call-template name="Node3"/> 
    </xsl:template> 
    .... 
    <xsl:template name="Node3"> 
    <!-- Here as CDATA i want the input xml content--> 
    </xsl:template> 

誰能幫助我解決這個問題?我使用XSLT 1.0

+0

您正在使用哪個XSLT處理器?在XSLT 2.0中,您可以使用'cdata-section-elements =「Node3」',但您提到您使用的是1.0。在那種情況下,我認爲你被困在特定於處理器的擴展中。 – LarsH 2013-04-11 15:29:52

+0

javax.xml.transform.Transformer – KK99 2013-04-11 15:33:23

回答

1

在XSLT 1.0,你可以試試這個骯髒的技術(不能保證工作):

<xsl:template name="Node3"> 
    <Node3> 
    <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text> 
    <xsl:copy-of select="/" /> 
    <xsl:text>]]></xsl:text> 
    </Node3> 
</xsl:template> 

我說「髒」,因爲disable-output-escaping通常意味着你試圖用錘子驅動螺絲;也就是說,您正在使用工具來實現它無法提供的目的。不保證能夠工作,特別是如果XSLT處理器無法控制序列化。

您可能能夠避免這種骯髒的技術。我首先要問,爲什麼應該輸出XML在CDATA部分? CDATA要求背後肯定有不同的要求(否則CDATA要求是任意的)。

也許真正的要求是,你要輸入的XML輸出轉義,因此,無論XML解析器讀取它接下來將它讀成文本而不是將其解析成樹?

感謝:https://stackoverflow.com/a/1364884/423105

+0

謝謝。其實這工作' <![CDATA [ \t ] >' – KK99 2013-04-11 19:23:21

+0

由於歷史的原因,我需要保存輸入XML,並存儲在數據庫 – KK99 2013-04-11 19:23:56

+0

哎呀,關於'<'謝謝你的更正。將編輯我的答案。因爲'>'不需要轉義,所以我沒有在第二個'xsl:text'上看到d-o-e或'>'的需要。但是,我還沒有測試過它。 – LarsH 2013-04-11 19:51:51