XML sortieren (c#)

Code:
Was genau meinst du mit Direktive?
Ich meinte eigentlich einen using Block, nicht die Direktive :)

Ich denke das sollte bei XSLT geschehen, aber wie kann man das einbinden?

XML:
 <xsl:template match="/Settings/Setting">
    <xsl:copy>
       <xsl:copy-of select="@*[name(.)!='Version' and name(.)!='LastChanged' ]"/>
      <xsl:apply-templates select="*">
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
 
  • Gefällt mir
Reaktionen: TresPuntos
umask007 schrieb:
XML:
<xsl:template match="/Settings/Setting">
<xsl:copy>
<xsl:copy-of select="@*[name(.)!='Version' and name(.)!='LastChanged' ]"/>
<xsl:apply-templates select="*">
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
Danke die Lösung ist die gleiche, aber für mich ist deine trotzdem eleganter gelöst :)

umask007 schrieb:
Ich meinte eigentlich einen using Block, nicht die Direktive :)
Gut falsch verstanden, aber auf den richtigen Zeiger geführt, sodass ich .Dispose() entdeckt habe :D

Danke nochmal würde deine riesen Unterstützung :)
 
Hi,

ich melde mich nach längerer Zeit wieder auf den Feed.
Mir ist nämlich ein weiteres Problem aufgekommen und habe dazu nichts im Internet gefunden.
Den aktuellen Stand der XSLT sieht man unten.
Nun zu meinem Problem:
Ist es möglich mit der XSLT-Sortierung nicht auf einen Attribut zu greifen, sondern auf desen Tagbezeichnung und anhand dieser weiter zu sortieren?
Sprich ich habe diese Strukutur:
XML:
<?xml version="1.0" encoding="utf-8"?>
<Settings Version="0.0.0.0">
  <Setting Key="Test" LastChanged="..." Version="0.0.0.0">
      <BeispeilB>Test</BeispielB>
    <BeispeilA>Test</BeispielA>
  </Setting>
</Settings>

Es soll weiterhin nach Key sortiert werden, aber sobald kein Attribut vorhanden ist, soll nach dem Knotennamen sortiert werden.

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

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

  <xsl:template match="/Settings/Setting/Value//*[property]">
    <xsl:copy>
       <xsl:copy-of select="@*"/>
      <xsl:apply-templates select="property">
        <xsl:sort select="translate(@name, 'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/> <!--Case insensitives sortieren-->
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
   
  <xsl:template match="/Settings">
    <xsl:copy>
       <xsl:copy-of select="@*"/>
      <xsl:apply-templates select="Setting">
        <xsl:sort select="@Key"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

   <xsl:template match="/Settings/Setting">
    <xsl:copy>
       <xsl:copy-of select="@*[name(.)!='Version' and name(.)!='LastChanged' ]"/>
      <xsl:apply-templates select="*">
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
   
   <xsl:template match="/Settings">
    <xsl:copy>
       <xsl:copy-of select="@*[name(.)!='Version']"/>
      <xsl:apply-templates select="*">
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
 
Verstehe die Anforderung nicht. Kannst du ein Beispiel Input und den gewünschten Output zur Verfügung stellen?

Btw, das /Settings Template kommt doppelt vor, kann mir nicht vorstellen dass das Absicht war.
 
Nehmen wir das Beispiel von oben und erweitern es etwas:

XML:
<?xml version="1.0" encoding="utf-8"?>
<Settings Version="0.0.0.0">
  <Setting Key="Test1" LastChanged="..." Version="0.0.0.0">
      <BeispeilB>Test</BeispielB>
      <BeispeilA>Test</BeispielA>
  </Setting>
    <Setting Key="Test3" LastChanged="..." Version="0.0.0.0">
      <BeispeilB>Test</BeispielB>
      <BeispeilA>Test</BeispielA>
  </Setting>
    <Setting Key="Test2" LastChanged="..." Version="0.0.0.0">
      <BeispeilB>Test</BeispielB>
      <BeispeilA>Test</BeispielA>
  </Setting>
</Settings>

Es soll erst auf das Attribut Key geachtet werden und danach gibt es bei den unterknoten keine Attribute mehr und deswegen soll nach Tag sortiert werden:
XML:
<?xml version="1.0" encoding="utf-8"?>
<Settings Version="0.0.0.0">
  <Setting Key="Test1" LastChanged="..." Version="0.0.0.0">
      <BeispeilA>Test</BeispielA>
      <BeispeilB>Test</BeispielB>
  </Setting>
  <Setting Key="Test2" LastChanged="..." Version="0.0.0.0">
      <BeispeilA>Test</BeispielA>
      <BeispeilB>Test</BeispielB>
  </Setting>
  <Setting Key="Test3" LastChanged="..." Version="0.0.0.0">
      <BeispeilA>Test</BeispielA>
      <BeispeilB>Test</BeispielB>
  </Setting>
</Settings>

Hast du dafür eine Lösung?
 
XML:
  <xsl:template match="/Settings/Setting">
    <xsl:copy>
       <xsl:copy-of select="@*[name(.)!='Version' and name(.)!='LastChanged' ]"/>
       <xsl:apply-templates select="Value">
       </xsl:apply-templates>
       <xsl:apply-templates select="*[name(.)!='Value']">
            <xsl:sort select="name(.)"/>
       </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

Hier das komplette Beispiel:
https://xsltfiddle.liberty-development.net/jyH9rMF/3
 
Hallo nach längerer Zeit melde ich mich mal wieder,

wie ist es möglich bei deinem Projekt jetzt als Beispiel:
1. Meine "Anforderung" ist es alle Attribute von LastChanged und Version zu entfernen
2. Alle Setting nach dem Attribut key zu sortieren
3. Alles unter Settings/Setting/Value nach Tag Name zu sortieren
4. Alles unter Settings/Setting/Value die properties nach dem Attribut name zu sortieren
5. Bei der Reproduktion von Xslt zu XML, wie kann man es so handeln, dass sich die Tags in diesem Format bleiben wenn sie leer sind : <Beispiel></Beispiel>?

Mit alles darunter meine ich alle verschachtellungen die es gibt, weil da liegt aktuell mein Problem, dass alles aus den unteren Hierarchen nicht sortiert wird, abgesehen von der sortierung von properties. Könnte mir da jemand helfen?

XML:
<Settings Version="0.0.0.0" Test="abc">
  <Setting Key="B">
        <Value>
            <Test>
                <B>
                    <Hallo2></Hallo2>
                    <Hallo1></Hallo1>
                </B>
                <A></A>
            </Test>
            <Beispiel></Beispiel>
        </Value>
  </Setting>
  <Setting Key="A">
    <Value>
      <Xtra version="1.0" application="View">
        <property name="A" />
        <property name="Item3" iskey="true">
           <property name="Columns" value="4">
                 <property name="Item1">Beispiel1</property>
                 <property name="Item2">Beispiel2</property>
           </property>
           <property name="AColumns" value="4">
                 <property name="Item5">Beispiel5</property>
                 <property name="Item2">Beispiel1</property>
           </property>
        </property>
        <property name="C">-1</property>
        <property name="B">
            <property name="TEST1">Hallo</property>
            <property name="TEST3">Hallo</property>
        </property>
      </Xtra>
    </Value>
  </Setting>
</Settings>

Das dieses Beispiel in folgenden Code sortiert wird:
XML:
<Settings Test="abc">
  <Setting Key="A">
    <Value>
      <Xtra  application="View">
        <property name="A" />
                <property name="AColumns" value="4">
                <property name="B">
            <property name="TEST1">Hallo</property>
            <property name="TEST3">Hallo</property>
        </property>
                <property name="C">-1</property>
                 <property name="Item5">Beispiel5</property>
                 <property name="Item2">Beispiel1</property>
                </property>
                <property name="Item3" iskey="true">
                    <property name="Columns" value="4">
                        <property name="Item1">Beispiel1</property>
                        <property name="Item2">Beispiel2</property>
                    </property>
                </property>
      </Xtra>
    </Value>
  </Setting>
    <Setting Key="B">
        <Value>
            <A></A>
            <Beispiel></Beispiel>
            <Test>
                <B>
                    <Hallo1></Hallo1>
                    <Hallo2></Hallo2>
                </B>
            </Test>
        </Value>
  </Setting>
</Settings>
 
Zuletzt bearbeitet:
Danke für die Hilfe:) ,

dass wird auch die letzte Frage gewesen sein.

hatte in der zwischenzeit eine eigene Lösung entwickelt, die funktioniert aber mit deine ist in Verkürzter Form besser.
XML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="no"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@*">
        <xsl:sort select="name()"/>
        <xsl:sort select="@text()"/>
      </xsl:apply-templates>
      <xsl:apply-templates select="*">
        <xsl:sort select="name()"/>
        <xsl:sort select="@*"/>
        <xsl:sort select="count(@*)"/>
        <xsl:sort select="@text()"/>
        <xsl:sort select="text()"/>
        <xsl:sort select="descendant::text()"/>
      </xsl:apply-templates>
      <xsl:if test="text() != ''">
        <xsl:value-of select="text()"/>
      </xsl:if>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/Settings/Setting/Value//*[property]">

    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates select="property">
        <xsl:sort select="translate(@name, 'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
        <!--Case insensitives sortieren-->
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="/Settings">
    <xsl:copy>
      <xsl:copy-of select="@*[name(.)!='Version']"/>
      <xsl:apply-templates select="Setting">
        <xsl:sort select="@Key"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/Settings/Setting">
    <xsl:copy>
      <xsl:copy-of select="@*[name(.)!='Version' and name(.)!='LastChanged' ]"/>
      <xsl:apply-templates select="Value">
      </xsl:apply-templates>
      <xsl:apply-templates select="*[name(.)!='Value']">
        <xsl:sort select="name(.)"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
 
Zurück
Oben