2017-10-06 11 views
0

Ich muss eine XML-Datei mit xslt ändern. Die Anforderungen sind, dass ich die Struktur auf einen einzelnen Knoten reduzieren sollte, der eine Liste von Elementen enthält, die aus dem XML übernommen wurden, wobei einige Elemente den Namen ändern.Elementnamen dynamisch ändern XSLT 1.0

Ich habe es geschafft, das xslt nur die Felder zurückgeben, die ich zurückgeben möchte, aber ich habe keine Ahnung, wie Sie die Struktur der resultierenden XML ändern, so dass alle Felder in einem einzelnen Element unter <Item> Ebene aufgeführt sind . Hier ist ein Beispiel xml:

<MyData> 
<BigGroups> 
    <BigGroup> 
    <Id>100</Id> 
    <LittleGroups> 
     <LittleGroup> 
     <Id>10</Id> 
     <Items> 
      <Item> 
      <ItemId>1</ItemId> 
      <Foo> 
       <This>Here This is</This> 
       <That>That is here</That> 
      </Foo> 
      <Bar> 
       <Camp> 
       <Another>Look Another one</Another> 
       </Camp> 
       <More>Oh god; more</More> 
      </Bar> 
      </Item> 
      <Item> 
      <ItemId>2</ItemId> 
      <Foo> 
       <This>Here This is</This> 
       <That>That is here</That> 
      </Foo> 
      <Bar> 
       <Camp> 
       <Another>Look Another one</Another> 
       </Camp> 
       <More>Oh god; more</More> 
      </Bar> 
      </Item> 
     </Items> 
     </LittleGroup> 
     <Id>20</Id> 
     <!--Items, Item, Foo, Bar etc--> 
    </LittleGroups> 
    <!--More Little Groups maybe--> 
    </BigGroup> 
</BigGroups> 
</MyData> 

Ich habe folgendes Xslt:

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

    <Translate:Fields> 
    <Field> 
     <OldName>This</OldName> 
     <NewName>NEW_This</NewName> 
    </Field> 
    <Field> 
     <OldName>ItemId</OldName> 
    </Field> 
    <Field> 
     <OldName>Another</OldName> 
    </Field> 
    </Translate:Fields> 

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

    <xsl:template match="*[not(descendant-or-self::*[name()=document('')/*/Translate:Fields/Field/OldName])]"> 
    </xsl:template> 
</xsl:stylesheet> 

die nur die Felder hält ich will, aber jetzt brauche ich die Ausgabe konvertieren im Wesentlichen eine Gruppe von Elementen countain zu je Artikel, mit allen untergeordneten Elemente in der gleichen Ebene - wie folgt aussehen:

<MyData> 
    <Item> 
    <ItemId>1</ItemId> 
    <NEW_This>Here This is</NEW_This> 
    <Another>Look Another one</Another> 
    </Item> 
    <Item> 
    <ItemId>2</ItemId> 
    <NEW_This>Here This is</NEW_This> 
    <Another>Look Another one</Another> 
    </Item> 
</MyData> 

ich bin völlig ratlos, wie kann ich die Struktur so sind alle Felder in einem einzigen Element zu ändern, in diesem cas gruppiert e nach Artikel. Wenn Sie sich umsehen, scheinen alle Beispielfälle zum Umbenennen von Elementen davon auszugehen, dass Sie die alten und neuen Namen fest in die xslt codieren können (wie diese How to replace a node-name with another in Xslt?), aber ich muss speziell eine Liste alter und neuer Feldnamen verwenden Beispiel oben.

Ich kann das nachschlagen verwenden übersetzen, die nach langer Suche enthalten Felder, aber ich kann die Elemente mit <NewName> Werten nicht zu aktualisieren scheinen (Ich habe xsl:element name= Typbits benutzen, aber es scheint immer neue Felder hinzuzufügen, keine Namen ersetzen Jede Hilfe wäre sehr geschätzt

Antwort

0

man es hier einen Weg, aussehen könnte:.!.

1,0 XSL

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

<!-- keep these --> 
<xsl:template match="MyData | Item | ItemId | Another"> 
    <xsl:copy> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

<!-- rename this --> 
<xsl:template match="This"> 
    <NEW_This> 
     <xsl:apply-templates/> 
    </NEW_This> 
</xsl:template> 

<!-- suppress other leaf nodes --> 
<xsl:template match="*[text()]" priority="0"/> 

</xsl:stylesheet> 
+0

Thanks @ michael.hor257k Die Schwierigkeit, die ich hier habe, ist die Anforderung, die alten und neuen Namen fest in die xslt zu codieren, um die Felder umzubenennen; Ich würde wirklich gerne ein Schema wie das Übersetzen in meinem Beispiel verwenden, das ich verwende, um auszuwählen, welche Felder enthalten sind und wo neue Namen relevant sind. –

+0

Um zu klären, die Frage war teilweise gefragt, wie die enthaltenen Knoten dynamisch umbenannt werden, indem eine Liste von alten und neuen Namen verwendet wird (wie oben im Translate: Fields-Schema veranschaulicht); Es gibt andere Fälle wie den in der Frage verlinkten, die erklären, wie man einen einzelnen Knoten umbenennt, meistens mit der gleichen Methode, die Sie erwähnen - gibt es eine Möglichkeit, das zu konvertieren, um aus einer Liste zu bauen? –