2014-11-02 43 views
0

我想通過使用xslt轉換另一個xml來創建一個xml。 問題是:我在單個元素中使用了多個「xsl:select value = ...」的值,並將該元素標記爲CData元素。我在轉換後收到的價值包括多個CData,但我希望它們都在單個CData中。多個CData到一個

例如: 原始XML:

<test> 
    <text1>WOW</text1> 
    <text3>NO</text3> 
</test> 

XSLT(上面有頭有 「布拉」 值爲CDATA):

<?xml version="1.0" encoding="utf-8" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
    <xsl:output method="xml" cdata-section-elements="Bla" /> 
    <xsl:template match="/"> 
     <Bla id="bla"> 
      text<xsl:value-of select="test/text1" />moreText<xsl:value-of select="test/text3" /> 
     </Bla> 
    </xsl:template> 
</xsl:stylesheet> 

輸出的xml:

<?xml version="1.0" encoding="UTF-8"?><Bla id="bla"><![CDATA[text]]><![CDATA[WOW]]><![CDATA[moreText]]><![CDATA[NO]]></Bla> 

但是,我最想得到的是:

<?xml version="1.0" encoding="UTF-8"?><Bla id="bla"><![CDATA[textWOWmoreTextNO]]></Bla> 

任何人都知道我需要更改以實現此目的嗎?

謝謝!

+1

您使用哪種XSLT處理器?您是否嘗試用例如''?但是你的結果很奇怪,XSLT處理器是這​​樣做的嗎? – 2014-11-02 15:38:17

+0

我用我的java代碼(使用javax.xml.transform.TransformerFactory)和使用Altova XMLSpy嘗試了它。 – APT 2014-11-02 15:40:08

+0

也,你給我的例子很棒! 如果沒有更好的解決方案。我會用它。 謝謝:) – APT 2014-11-02 16:23:09

回答

1

我試圖與撒克遜6.5.5和9.5撒克遜你的例子,它們都輸出一個單一CDATA部

<?xml version="1.0" encoding="UTF-8"?><Bla id="bla"><![CDATA[ 
      textWOWmoreTextNO]]></Bla> 

和至少爲XSLT 2.0我認爲http://www.w3.org/TR/xslt-xquery-serialization/#serdm與「對於相鄰的文本節點的每個子序列在S5中,將單個文本節點複製到新序列中,該序列等於按順序連接的子序列中文本節點的值,任何長度爲零的文本節點都將被刪除。規定創建的相鄰文本節點應該合併,然後用cdata-section-elements進行序列化,你應該得到一個CDATA節。如果您使用的XSLT處理器沒有這樣做,那麼請在其上提交一個錯誤消息,因爲解決方法是嘗試創建一個帶有xsl:value-of select="concat(...)"的單個文本,例如, <Bla id="bla"><xsl:value-of select="concat('text', test/text1, 'moreText', test/text3)"/></Blah>

+0

它工作(使用撒克遜)!謝謝 :) – APT 2014-11-03 12:37:58