2011-07-01 64 views
5

我是XSLT的新用戶,並一直在努力解決此問題。XSL將根節點複製到+添加屬性

源XML:

<ABC X="" Y="" Z=""/> 

結果XML:

<CDE F=""> 
<ABC X="" Y="" Z"" G=""/> 
</CDE> 

因此我需要

  • 與在結果XML一個默認值的屬性創建一個根節點。
  • 複製節點(源只有一個節點)從源到結果xml。
  • 將附加屬性添加到從源xml複製的節點。

我可以單獨做這些,但我無法在一個XSLT中完成所有這些操作。

+1

+1爲乾淨的問題。 –

+0

+1爲empo說 –

回答

2

鑑於你的假設,看來你需要一個最小化的模板:

<xsl:template match="ABC"> 
<CDE F=""> 
    <xsl:copy> 
    <xsl:copy-of select="@*"/> 
    <xsl:attribute name="G">hello</xsl:attribute> 
    </xsl:copy> 
</CDE> 
</xsltemplate> 

或者,如果你喜歡:

<xsl:template match="/"> 
<CDE F=""> 
    <xsl:apply-templates select="ABC"/> 
</CDE> 
</xsl:template> 

<xsl:template match="ABC"> 
    <xsl:copy> 
    <xsl:copy-of select="@*"/> 
    <xsl:attribute name="G">hello</xsl:attribute> 
    </xsl:copy> 
</xsl:template> 
0

你的示例XML並不需要它(見@ EMPO的答案)但是當開始時要學習的最重要的事情是「身份轉換」模板。它基本上原樣複製了所有的XML輸入,並且未經修改。通常可以通過覆蓋與其他模板的身份轉換來完成您需要做的任何更改。

下面是一個例子樣式表,讓你你要找的輸出:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="/ABC"> 
    <CDE F=""> 
     <ABC G=""> 
     <xsl:copy-of select="@*"/> 
     </ABC> 
    </CDE> 
    </xsl:template> 

</xsl:stylesheet> 

注意:「身份轉換」在處理輸入XML時,因爲match="/ABC"模板處理一個並不習慣元素,你有。但是,如果要將某些內容添加到XML中,則它將不變地包含在輸出中。

例如,該修改的XML輸入:

<ABC X="" Y="" Z=""> 
    <FOO BAR=""/> 
</ABC> 

具有以下樣式表transfomed(與上述相同,只我添加<xsl:apply-templates/>/ABC模板):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="/ABC"> 
    <CDE F=""> 
     <ABC G=""> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates/> 
     </ABC> 
    </CDE> 
    </xsl:template> 

</xsl:stylesheet> 

產生以下輸出:

<CDE F=""> 
    <ABC G="" X="" Y="" Z=""> 
     <FOO BAR=""/> 
    </ABC> 
</CDE> 
相關問題