2012-04-03 2 views
0

Ich habe die folgende XML-DateiWie XML zu transformieren, während alten Knoten kombiniert und die Generierung neue UUID Elemente

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<dictionaryEntry type="CM_Vserver"> 
    <uuid>27bfb32f-baa1-4571-abb5-c644c132ceea</uuid> 
    <object-attributes> 
     <object-attribute type="String" naturalKey="false" name="admin_state"> 
      <description>some text</description> 
     </object-attribute> 
    </object-attributes> 
    <object-references> 
     <object-reference refCol="cluster_id" naturalKey="true" name="cluster"> 
      <type>49f5f09e-dcae-4922-98aa-0b4a58f27fda</type> 
      <description>some text</description> 
     </object-reference> 
    </object-references> 
</dictionaryEntry> 

und ich würde es in die folgenden XML verwandeln mag:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<dictionaryEntry type="CM_Vserver"> 
    <uuid>27bfb32f-baa1-4571-abb5-c644c132ceea</uuid> 
    <dictionary-entry-properties> 
     <dictionary-entry-property xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="objectAttribute" attributeType="String" name="admin_state" naturalKey="false"> 
      <uuid>9ccbbd60-0e62-4ae7-b158-e6825441f987</uuid> 
      <description>some text</description> 
     </dictionary-entry-property> 
     <dictionary-entry-property xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="objectReference" referredColumn="cluster_id" name="cluster" naturalKey="true"> 
      <uuid>afa8c22d-5af9-424e-af6d-106ad96dadbd</uuid> 
      <referenceType>49f5f09e-dcae-4922-98aa-0b4a58f27fda</referenceType> 
      <description>some text</description> 
     </dictionary-entry-property> 
    </dictionary-entry-properties> 
</dictionaryEntry> 

Beachten Sie, dass Ich muss die folgenden Änderungen vornehmen:

  1. Benennen Sie Objekt-Attribut in Wörterbuch-Eintrag-Eigenschaft
  2. Rename Objekt-Referenz in Wörterbuch-Eintrag-Eigenschaft
  3. Umbenennen Objekt-Referenzen/Objekt-Referenz/Typ in Reference
  4. ex Objekt-Referenzen und Ex-Objekt-Referenzen Wörterbuch-Eintrag-Eigenschaften in einzelnen Knoten Kombinieren
  5. genannt
  6. generieren UUID für jedes Objekt-Referenzen

Vielen Dank im Voraus.

Antwort

0

Bevor ich antworten, zwei Dinge miteinander zu vereinbaren:

Erstens: Sie haben nicht alle Änderungen beschrieben, die in der gewünschten XML erscheinen. Zum Beispiel scheint das Element <dictionary-entry-property> einen zuvor fehlenden Namensraum zu erhalten; Außerdem ändern sich einige Attributnamen. Da Sie diese in Ihrer Änderungsliste nicht angeben, werde ich sie ignorieren. Lass mich wissen, dass sie am Ende wichtig sind und ich werde meine Antwort überarbeiten.

Zweitens: benötigen Sie eine UUID aus einem bestimmten Grund? Oder muss dieser Wert einfach einzigartig sein?

Wenn Sie die vorherige beantwortet haben, finden Sie unter diesem Link eine Diskussion darüber, wie dies getan werden könnte: . Kurz gesagt, Sie werden sich wahrscheinlich auf externe Methoden verlassen müssen, wie zum Beispiel die EXSLT Bibliothek oder random number generation with FXSL.

Wenn Sie auf die andere Seite geantwortet haben, hilft Ihnen die the generate-id() Funktion (ich benutze diesen Ansatz in meiner Antwort). In jedem Szenario ist folgendes zu beachten:

Wenn diese XSLT gegen Ihre bereitgestellt XML ausgeführt wird:

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

    <!-- Identity Template: copies everything as-is --> 
    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <!-- Add new <dictionary-entry-properties> element to --> 
    <!-- contain all of our result elements --> 
    <xsl:template match="dictionaryEntry"> 
    <xsl:copy> 
     <dictionary-entry-properties> 
     <xsl:apply-templates/> 
     </dictionary-entry-properties> 
    </xsl:copy> 
    </xsl:template> 

    <!-- Replace <object-attributes> nodes with --> 
    <!-- <dictionary-entry-properties> nodes --> 
    <xsl:template match="object-attributes"> 
    <xsl:apply-templates/> 
    </xsl:template> 

    <!-- Replace <object-attribute> and <object-reference> elements --> 
    <!-- with a new <dictionary-entry-property> element; additionally, --> 
    <!-- create a <uuid> element with a unique value --> 
    <xsl:template match="object-attribute | object-reference"> 
    <dictionary-entry-property> 
     <xsl:apply-templates select="@*"/> 
     <uuid> 
     <xsl:value-of select="generate-id()"/> 
     </uuid> 
     <xsl:apply-templates/> 
    </dictionary-entry-property> 
    </xsl:template> 

    <!-- Rename <type> elements (with <object-reference> parents --> 
    <!-- and <object-references> grandparents) to <referenceType> --> 
    <xsl:template match="object-references/object-reference/type"> 
    <referenceType> 
     <xsl:apply-templates/> 
    </referenceType> 
    </xsl:template> 

    <!-- <object-references> elements should be removed altogether --> 
    <xsl:template match="object-references"> 
    <xsl:apply-templates/> 
    </xsl:template> 

</xsl:stylesheet> 

diese XML erzeugt wird:

<?xml version="1.0" encoding="UTF-8"?> 
<dictionaryEntry> 
    <dictionary-entry-properties> 
    <uuid>27bfb32f-baa1-4571-abb5-c644c132ceea</uuid> 
    <dictionary-entry-property type="String" naturalKey="false" name="admin_state"> 
     <uuid>i__21420544_12</uuid> 
     <description>some text</description> 
    </dictionary-entry-property> 
    <dictionary-entry-property refCol="cluster_id" naturalKey="true" name="cluster"> 
     <uuid>i__21420544_25</uuid> 
     <referenceType>49f5f09e-dcae-4922-98aa-0b4a58f27fda</referenceType> 
     <description>some text</description> 
    </dictionary-entry-property> 
    </dictionary-entry-properties> 
</dictionaryEntry> 
Verwandte Themen