2011-07-01 18 views
5

Jestem nowym użytkownikiem XSLT i zmagałem się z tym problemem.XSL do kopiowania węzła głównego do atrybutów dodawania +

Źródło XML:

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

Wynik XML:

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

Zatem muszę

  • Utwórz węzeł główny z atrybutu o wartości domyślnej w pliku XML wynikowej.
  • Węzeł kopiowania (źródło ma tylko jeden węzeł) od źródła do wyniku xml.
  • Dodaj dodatkowe atrybuty do węzła skopiowanego z źródłowego xml.

Jestem w stanie zrobić to osobno, ale nie jestem w stanie zrobić wszystkiego w jednym XSLT.

+1

+1 za czyste pytanie. –

+0

+1 za to, co powiedział empo –

Odpowiedz

2

Biorąc pod uwagę twoje założenia, wydaje trzeba jedną minimalną szablonu:

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

lub, jeśli wolisz:

<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

Twój przykład XML nie potrzebuje go (patrz @ odpowiedź Empo za) ale na początku najważniejszą rzeczą do nauczenia się jest szablon "przekształcenia tożsamości". Zasadniczo kopiuje wszystkie dane wejściowe XML tak jak jest i jest niezmodyfikowana. Wszelkie zmiany, które należy wprowadzić, można zwykle wykonać, zastępując przekształcenie tożsamości innymi szablonami.

Oto przykładowy arkusz stylów, który daje wyjście szukasz:

<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> 

UWAGA: „tożsamość przekształcić” nie przyzwyczaić podczas przetwarzania XML wejściowego ponieważ szablon match="/ABC" obsługuje jedną element, który masz. Jeśli jednak dodałeś coś do swojego XML-a, to zostałoby to niezmienione w wyniku.

Na przykład, zmodyfikowane wejście XML:

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

transfomed z następującym arkusza (jak wyżej, tylko dodano <xsl:apply-templates/> do /ABC matrycy):

<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> 

wytwarza następujących wyjście:

<CDE F=""> 
    <ABC G="" X="" Y="" Z=""> 
     <FOO BAR=""/> 
    </ABC> 
</CDE> 
Powiązane problemy