2009-05-18 13 views
3

Ich habe einige XML, welche Datensätze und Unter Datensätze enthält, wie folgt aus:Verschieben Unterknoten in übergeordnete Attribute mit XSLT

<data> 
    <record jsxid="id0x0b60fec0" ID="12429070" Created="2008-10-21T03:00:00.0000000-07:00"> 
     <record jsxid="id0x0b60ff10" string="101"/> 
     <record jsxid="id0x0e64d8e8" string="63"/> 
     <record jsxid="id0x2fd83f08" string="Y"/> 
    </record> 
    <record jsxid="id0x0b60fec0" ID="12429070" Created="2008-10-21T03:00:00.0000000-07:00"> 
     <record jsxid="id0x0b60ff10" string="102"/> 
     <record jsxid="id0x0e64d8e8" string="77"/> 
     <record jsxid="id0x2fd83f08" string="Y"/> 
    </record>  
<data> 

Ich brauche es zu transformieren, so dass die Zeichenfolge Attribut der Untersätze gebracht werden oben in der übergeordnete Datensatz als durchnumeriert Attribute und dann verworfen, wie folgt aus:

<data> 
    <record jsxid="id0x0b60fec0" ID="12429070" Created="2008-10-21T03:00:00.0000000-07:00" 1="101" 2="63" 3="Y"/> 
    <record jsxid="id0x0b60fec0" ID="12429070" Created="2008-10-21T03:00:00.0000000-07:00" 1="102" 2="77" 3="Y"/> 
<data> 

die Anzahl an Untersätzen ist in Dokumenten beliebigen, aber bleibt statisch innerhalb des gleichen Dokuments.

Würde jemand so freundlich sein, den Weg zu einer XSLT-Lösung zu weisen? Danke vielmals.

Antwort

5

Hier ist eine komplette Lösung:

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

    <!-- By default, recursively copy all nodes unchanged --> 
    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <!-- But don't process any children of <record> (such as whitespace)... --> 
    <xsl:template match="record/node()"/> 

    <!-- ...except for doubly-nested records; 
     convert them to attributes, named according to position --> 
    <xsl:template match="record/record" priority="1"> 
    <xsl:variable name="pos"> 
     <xsl:number/> 
    </xsl:variable> 
    <xsl:attribute name="r{$pos}"> 
     <xsl:value-of select="@string"/> 
    </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 

Bitte beachte, dass ich den Namen der Attribute auf „R1“, „R2“, usw., weil XML nicht zulässt, dass Sie einen Namen mit einem beginnen Nummer.

+0

vielen dank Evan – mysomic

1

Dies könnte es tun, das folgende Fragment von XSLT ausgeführt werden, wenn die Top-Level-Elemente <record> Verarbeitung:

<xsl:for-each select="record"> 
    <xsl:attribute name="{position()}"> 
     <xsl:value-of select="@string" /> 
    </xsl:attribute> 
</xsl:for-each> 

Wesentlichen diese iteriert über jedes sub- <record> Element und erzeugt ein <xsl:attribute> Element das gewünschte Attribut beschreibt. Die position() Funktion wird aufgerufen, um die relative Position innerhalb des obersten Elements zu erhalten: 1, 2, 3 usw.

Dies ist keine vollständige Lösung; eine gewisse Vertrautheit mit XSLT wird vorausgesetzt.

+0

haha, auf eigene Gefahr :-) – mysomic

+0

.... obwohl es definitiv auf meinem Radar ist, ist die Bestellung jetzt bei Amazon. – mysomic

Verwandte Themen