2016-10-24 21 views
0

ich eine XML-Datei, die wie folgt aussieht:Kopieren Datei ohne Duplikate

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:stuff> 
     <xs:nestedStuff name="nested"/> 
    </xs:stuff> 
    <xs:simpleType name="A_B"> 
     <xs:union memberTypes="xs:A xs:B"/> 
    </xs:simpleType> 
    <xs:simpleType name="A_B_C"> 
     <xs:union memberTypes="xs:A xs:B xs:C"/> 
    </xs:simpleType> 
    <xs:simpleType name="A_B"> 
     <xs:union memberTypes="xs:A xs:B"/> 
    </xs:simpleType> 
    <xs:simpleType name="A_B"> 
     <xs:union memberTypes="xs:A xs:B"/> 
    </xs:simpleType> 
    <xs:simpleType name="A_B_C"> 
     <xs:union memberTypes="xs:A xs:B xs:C"/> 
    </xs:simpleType> 
    <xs:simpleType name="A_C"> 
     <xs:union memberTypes="xs:A xs:C"/> 
    </xs:simpleType> 
</xs:schema> 

Was ich will ist, jede einzelne Zeile der Datei mit Ausnahme der doppelten simpleType Elemente tun, zu kopieren, so dass ich

bekommen würde
<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:stuff> 
     <xs:nestedStuff name="nested"/> 
    </xs:stuff> 
    <xs:simpleType name="A_B"> 
     <xs:union memberTypes="xs:A xs:B"/> 
    </xs:simpleType> 
    <xs:simpleType name="A_B_C"> 
     <xs:union memberTypes="xs:A xs:B xs:C"/> 
    </xs:simpleType> 
    <xs:simpleType name="A_C"> 
     <xs:union memberTypes="xs:A xs:C"/> 
    </xs:simpleType> 
</xs:schema> 

Ich kann XLST-2.0 nicht verwenden. Ich bin sehr neu in XSLT, und ich habe verschiedene Dinge aus here versucht, aber es gilt nicht für mein Problem, wie ich dachte, dass es getan hat. Hier ist ein Beispiel dafür, was ich versuchte, und das führt zu einer Ausgabe genau gleich den Eingang:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="@*|node()"> 
     <xsl:for-each select="simpleType/@name[not(.=preceding::*)]"> 
      <xsl:element name="xs:TEST"> 
      </xsl:element> 
     </xsl:for-each> 

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

    </xsl:template> 
</xsl:stylesheet> 

Antwort

1

I. gültige XML-

IhrFormal gezeigt XML ist nicht wohlgeformt und gültig. Sie müssen das Tag xs:nestedStuff schließen. Nicht so wichtig, weil ich glaube, es ist ein Mangel an minimiertem Beispiel. Sag es einfach.

II: 1,0 XSLT

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

    <xsl:key match="xs:simpleType" use="@name" name="key-for-types"/> 

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

    <xsl:template match="xs:simpleType[count(. | key('key-for-types', @name)[1]) &gt; 1]"/> 

</xsl:stylesheet> 

Identitätskopiervorlage alle Knoten zu kopieren. JA ist es möglich, dies in einer Form von xsl:copy-of ... zu schreiben, aber ich bevorzuge es so auf SO. Bewerte dich selbst, auf welche Weise du gehst.

Entfernen Sie alle doppelten Schlüsseleinträge über Muenchian Grouping.

+0

Richtig, ich schloss 'nestedStuff'. Vielen Dank, dieser Code funktioniert, ich werde jetzt einen Blick auf das Innenleben von Muenchian Grouping werfen. – Efferalgan

+0

Tipp: http://www.jenitennison.com/xslt/grouping/muenchian.html – uL1