2009-10-09 27 views
1

添加到一個節點到另一個我有這樣的XML:在XSLT

<configurationData> 
    <path name='b'> 
     <path name='a'> 
     <setting name='s1'> 
     ![CDATA[XXXX]] 
     </setting> 
     <setting name='s2'> 
      XXXX 
     </setting> 
     </path> 
    </path> 
    </configurationData> 

其中configurationData是根節點,並且可以有可嵌套路徑,隨後一個或多個設定的節點。我想設置節點轉換把設置節點的內容到名爲值的子節點

<configurationData> 
    <path name='b'> 
     <path name='a'> 
     <setting name='s1'> 
      <value>![CDATA[XXXX]]</value> 
     </setting> 
     <setting name='s2'> 
      <value>XXXX</value> 
     </setting> 
     </path> 
    </path> 
    </configurationData> 

我必須承認,我發現XML心理路障,我什麼也看不見XSLT使用:

這是我的嘗試:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output encoding ="utf-8" indent="yes" method="xml" version="1.0"/> 

    <xsl:template match='/setting'> 
    <xsl:apply-templates select='setting' /> 
    </xsl:template> 

    <xsl:template match='setting'> 
    <value> 
     <xsl:value-of select='.'/> 
    </value> 
    </xsl:template> 
</xsl:stylesheet> 
+2

+1顯示你的工作 – 2009-10-09 03:43:22

回答

3

你是那裏的90%。你需要的是「身份模板」

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output encoding ="utf-8" indent="yes" method="xml" version="1.0"/> 

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

    <xsl:template match='setting'> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <value> 
       <xsl:value-of select='.'/> 
      </value> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

第一個模板處理所有節點,將它們複製到輸出。然而,'設置'模板更具體地被'設置'節點調用,該模板複製節點本身及其屬性,然後將該值包裝在'值'標籤中。

關於XSLT最無關緊要的事情是樣式表不是驅動過程的程序。相反,它是控制的輸入XML文檔,樣式表提供的指令可根據輸入內容進行選擇和執行。這被稱爲「推送」處理。 XSL處理器將數據推送到您的樣式表。 XSLT確實具有一些過程能力,並且可以用「拉」樣式編寫樣式表,樣式表嘗試驅動該過程,但這更難並導致難以維護的樣式表。

編輯: 要啓用CDATA部分取代:

<xsl:value-of select='.' /> 

![CDATA[<xsl:value-of select='.' disable-output-escaping="yes"/>]] 

(雖然不是最佳的解決方案,因爲它總是把CDATA中)

+1

神奇的吉姆。只有一個小問題 - CDATA信息被音譯。我需要將CDATA保存爲CDATA。 – 2009-10-09 04:42:12

+0

只是一個想法。我想我可以使用CDATA總是不能嗎? – 2009-10-09 04:44:00

+1

@Preet Sangha:是的,通過聲明'cdata-section-elements' - 查看我的答案。但是,我不在乎它是否作爲CDATA出現,因爲在「數據級別」上它是等效的。 – Tomalak 2009-10-09 08:51:56

0

我的建議的基礎上,吉姆加里森回答:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
    <xsl:output method="xml" encoding="utf-8" cdata-section-elements="value" /> 

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

    <xsl:template match="setting/text()"> 
    <value> 
     <xsl:value-of select="." /> 
    </value> 
    </xsl:template> 

</xsl:stylesheet> 
+0

非常感謝。你能指出爲什麼這可能會更好嗎? – 2009-10-10 08:40:18

+0

這是一個不太複雜,更習慣。除此之外,沒有太大的區別。 – Tomalak 2009-10-10 09:17:57