1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Problem mit Sortierreihenfolge

Dieses Thema im Forum "XML Technologien" wurde erstellt von erti01, 21. März 2013.

  1. erti01

    erti01 Grünschnabel

    Hallo zusammen,

    ich habe folgende xml-Datei

    Code (Text):
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <Daten>
    3.     <Eintrag ID="20110929000001" ZE1="Organisation" ZE2="Netzwerke pflegen" ZE3="">
    4.         <Titel>Erstellung Geburtstagsliste</Titel>
    5.         <Datum>29.11.2011</Datum>
    6.         <Termin>0</Termin>
    7.         <Status>offen</Status>
    8.     </Eintrag>
    9.     <Eintrag ID="20111206100442" ZE1="SG" ZE2="TuA" ZE3="">
    10.         <Titel>Kontaktdaten</Titel>
    11.         <Datum>12.12.2011</Datum>
    12.         <Termin>2</Termin>
    13.         <Status>neu</Status>
    14.         <Dokument ID="20111206100555">
    15.             <Datum>01.12.2011</Datum>
    16.             <Originalname>AW: E-Titel </Originalname>
    17.             <Originalpfad/>
    18.             <Pfad>\Cockpit2_Dateien\20111206100555---AW_E-Titel.msg</Pfad>
    19.             <Name>AW: E-Titel angepasst </Name>
    20.             <Suchwort/>
    21.             <Version>1</Version>
    22.         </Dokument>
    23.     </Eintrag>
    24.     <Eintrag ID="20111205130302" ZE1="SAS" ZE2="Projekt" ZE3="">
    25.         <Titel>TuA-Paket</Titel>
    26.         <Datum>17.01.2012</Datum>
    27.         <Termin>40886</Termin>
    28.         <Status>erledigt</Status>
    29.         <Kommentar ID="20111205130416">
    30.             <Datum>05.12.2011</Datum>
    31.             <Text>Was ist Umfang der Lieferung</Text>
    32.         </Kommentar>
    33.     </Eintrag>
    34.     <Eintrag ID="20111205130124" ZE1="SAS" ZE2="Projekt" ZE3="">
    35.         <Titel>Testbewertung</Titel>
    36.         <Datum>16.01.2012</Datum>
    37.         <Termin>40885</Termin>
    38.         <Status>erledigt</Status>
    39.         <Dokument ID="20111206100922">
    40.             <Datum>03.12.2011</Datum>
    41.             <Originalname>laufende Tests</Originalname>
    42.             <Originalpfad/>
    43.             <Pfad>\Cockpit2_Dateien\20111206100922---laufende Tests.msg</Pfad>
    44.             <Name>Tests</Name>
    45.             <Suchwort/>
    46.             <Version>3</Version>
    47.         </Dokument>
    48.         <Kommentar ID="20111205130149">
    49.             <Datum>05.12.2011</Datum>
    50.             <Text>Rücksprache</Text>
    51.         </Kommentar>
    52.         <Dokument ID="20111206101921">
    53.             <Datum>05.12.2011</Datum>
    54.             <Originalname>Ergebnisse</Originalname>
    55.             <Originalpfad/>
    56.             <Pfad>\Cockpit2_Dateien\20111206101921---Ergebnisse.msg</Pfad>
    57.             <Name>Ergebnisse</Name>
    58.             <Suchwort/>
    59.             <Version>5</Version>
    60.         </Dokument>
    61.         <Dokument ID="20111206100922">
    62.             <Datum>02.12.2011</Datum>
    63.             <Originalname>Tests</Originalname>
    64.             <Originalpfad/>
    65.             <Pfad>\Cockpit2_Dateien\20111206100922---Tests.msg</Pfad>
    66.             <Name>Tests2</Name>
    67.             <Suchwort/>
    68.             <Version>2</Version>
    69.         </Dokument>
    70.         <Kommentar ID="20111208160533">
    71.             <Datum>08.12.2011</Datum>
    72.             <Text>Neue Tests</Text>
    73.         </Kommentar>
    74.     </Eintrag>
    75. </Daten>
    und will mit folgendem xslt
    Code (Text):
    1. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    2.   <xsl:strip-space elements="*"/>
    3.   <xsl:output method="xml" indent="yes"/>
    4.  
    5.    <xsl:template match="Daten">
    6.     <xsl:copy>
    7.       <xsl:apply-templates select="@* | node()">
    8.             <xsl:sort select="Termin" data-type="number"/>
    9.      </xsl:apply-templates>
    10.     </xsl:copy>
    11.   </xsl:template>
    12.  
    13.   <xsl:template match="Daten/Eintrag">
    14.     <xsl:copy>
    15.       <xsl:apply-templates  select="@* | node()">
    16.            <xsl:sort select="Version" order="descending" data-type="number"/>
    17.       </xsl:apply-templates>
    18.     </xsl:copy>
    19.   </xsl:template>
    20.  
    21.   <xsl:template match="@* | node()">
    22.     <xsl:copy>
    23.       <xsl:apply-templates select="@* | node()"/>
    24.     </xsl:copy>
    25.   </xsl:template>
    26.  
    27. </xsl:stylesheet>
    die Elemente sortieren.
    Dies funktioniert auch, solange ich für die Sortierung von <Version> in Zeile 16 im xslt nicht order = "Descending" setze. Bei "ascending" erhalte ich für die Sortierreihenfolge aufsteigend der Dokument-Knoten das erwartete Ergebnis.

    Code (Text):
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <Daten>
    3.   <Eintrag ID="20110929000001" ZE1="Organisation" ZE2="Netzwerke pflegen" ZE3="">
    4.     <Titel>Erstellung Geburtstagsliste</Titel>
    5.     <Datum>29.11.2011</Datum>
    6.     <Termin>0</Termin>
    7.     <Status>offen</Status>
    8.   </Eintrag>
    9.   <Eintrag ID="20111206100442" ZE1="SG" ZE2="TuA" ZE3="">
    10.     <Titel>Kontaktdaten</Titel>
    11.     <Datum>12.12.2011</Datum>
    12.     <Termin>2</Termin>
    13.     <Status>neu</Status>
    14.     <Dokument ID="20111206100555">
    15.       <Datum>01.12.2011</Datum>
    16.       <Originalname>AW: E-Titel </Originalname>
    17.       <Originalpfad />
    18.       <Pfad>\Cockpit2_Dateien\20111206100555---AW_E-Titel.msg</Pfad>
    19.       <Name>AW: E-Titel angepasst </Name>
    20.       <Suchwort />
    21.       <Version>1</Version>
    22.     </Dokument>
    23.   </Eintrag>
    24.   <Eintrag ID="20111205130124" ZE1="SAS" ZE2="Projekt" ZE3="">
    25.     <Titel>Testbewertung</Titel>
    26.     <Datum>16.01.2012</Datum>
    27.     <Termin>40885</Termin>
    28.     <Status>erledigt</Status>
    29.     <Kommentar ID="20111205130149">
    30.       <Datum>05.12.2011</Datum>
    31.       <Text>Rücksprache</Text>
    32.     </Kommentar>
    33.     <Kommentar ID="20111208160533">
    34.       <Datum>08.12.2011</Datum>
    35.       <Text>Neue Tests</Text>
    36.     </Kommentar>
    37.     <Dokument ID="20111206100922">
    38.       <Datum>02.12.2011</Datum>
    39.       <Originalname>Tests</Originalname>
    40.       <Originalpfad />
    41.       <Pfad>\Cockpit2_Dateien\20111206100922---Tests.msg</Pfad>
    42.       <Name>Tests2</Name>
    43.       <Suchwort />
    44.       <Version>2</Version>
    45.     </Dokument>
    46.     <Dokument ID="20111206100922">
    47.       <Datum>03.12.2011</Datum>
    48.       <Originalname>laufende Tests</Originalname>
    49.       <Originalpfad />
    50.       <Pfad>\Cockpit2_Dateien\20111206100922---laufende Tests.msg</Pfad>
    51.       <Name>Tests</Name>
    52.       <Suchwort />
    53.       <Version>3</Version>
    54.     </Dokument>
    55.     <Dokument ID="20111206101921">
    56.       <Datum>05.12.2011</Datum>
    57.       <Originalname>Ergebnisse</Originalname>
    58.       <Originalpfad />
    59.       <Pfad>\Cockpit2_Dateien\20111206101921---Ergebnisse.msg</Pfad>
    60.       <Name>Ergebnisse</Name>
    61.       <Suchwort />
    62.       <Version>5</Version>
    63.     </Dokument>
    64.   </Eintrag>
    65.   <Eintrag ID="20111205130302" ZE1="SAS" ZE2="Projekt" ZE3="">
    66.     <Titel>TuA-Paket</Titel>
    67.     <Datum>17.01.2012</Datum>
    68.     <Termin>40886</Termin>
    69.     <Status>erledigt</Status>
    70.     <Kommentar ID="20111205130416">
    71.       <Datum>05.12.2011</Datum>
    72.       <Text>Was ist Umfang der Lieferung</Text>
    73.     </Kommentar>
    74.   </Eintrag>
    75. </Daten>
    Hier will ich die höchste Version als erstes Dokument-Element innerhalb des Eintrag-Knoten erhalten.

    Warum funktioniert das xlst nicht?

    Leider benötige ich die Sotierung im xml, weil es ein weiteres Programm diese nutzt und hier die Anzeige nicht sortierbar gestaltet wurde. Wenn die Elemente in der richtigen Reihenfolge vorliegen, erfolgt auch die Anzeige korrekt.

    Vielen Dank für Lösungen/Hinweise

    Thomas
     
  2. deepthroat

    deepthroat Erfahrenes Mitglied

    Hi.

    Welchen XSLT Prozessor verwendest du denn?

    Bei mir funktioniert dein Stylesheet nach einer kleinen Änderung wie vergesehen:
    Code (XML):
    1. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    2.   <xsl:strip-space elements="*"/>
    3.   <xsl:output method="xml" indent="yes"/>
    4.  
    5.   <xsl:template match="Daten">
    6.     <xsl:copy>
    7.       <xsl:apply-templates  select="@*" />
    8.       <xsl:apply-templates  select="node()">
    9.         <xsl:sort select="Termin" data-type="number"/>
    10.       </xsl:apply-templates>
    11.     </xsl:copy>
    12.   </xsl:template>
    13.  
    14.   <xsl:template match="Daten/Eintrag">
    15.     <xsl:copy>
    16.       <xsl:apply-templates  select="@*" />
    17.       <xsl:apply-templates  select="node()">
    18.         <xsl:sort select="Version" order="descending" data-type="number"/>
    19.       </xsl:apply-templates>
    20.     </xsl:copy>
    21.   </xsl:template>
    22.  
    23.   <xsl:template match="@* | node()">
    24.     <xsl:copy-of select="." />
    25.   </xsl:template>
    26.  
    27. </xsl:stylesheet>
     
    Zuletzt von einem Moderator bearbeitet: 23. Mai 2014
  3. erti01

    erti01 Grünschnabel

    Hi,

    ich nutze folgenden Code in vb.net

    Code (Text):
    1. Imports System.Xml
    2. Imports System.Xml.Xsl
    3. Imports System.Xml.XPath
    4. Imports System.Xml.Linq
    5. Imports System.Runtime.CompilerServices
    6.  
    7. Module Module1
    8.  
    9.  
    10.     Function Main(ByVal cmdArgs() As String) As Integer
    11.  
    12.         Dim returnValue As Integer = 0
    13.         If cmdArgs.Length <> 3 Then
    14.             Console.WriteLine("Aufruf eingabe.xml ausgabe.xml transform.xsl")
    15.             returnValue = 1
    16.             Return returnValue
    17.         Else
    18.             Console.WriteLine(cmdArgs(0) & " => " & cmdArgs(2) & " => " & cmdArgs(1))
    19.         End If
    20.  
    21.         Dim xslt As New XslCompiledTransform
    22.         Try
    23.             xslt.Load(cmdArgs(2))
    24.         Catch ex As Exception
    25.             Console.WriteLine("Fehler bei Laden Transformationsbeschreibung")
    26.             Console.WriteLine(ex.ToString)
    27.             Console.WriteLine(ex.Message.ToString)
    28.             returnValue = 2
    29.             Return returnValue
    30.         End Try
    31.  
    32.         Try
    33.             xslt.Transform(cmdArgs(0), cmdArgs(1))
    34.         Catch ex As Exception
    35.             Console.WriteLine("Fehler bei Transformation")
    36.             Console.WriteLine(ex.ToString)
    37.             Console.WriteLine(ex.Message.ToString)
    38.             returnValue = 3
    39.             Return returnValue
    40.         End Try
    41.         Return returnValue
    42.     End Function
    43.  
    44. End Module
    Ich habe deine Änderung eingefügt und jetzt funktioniert es.

    Vielen DANK
    Thomas
     
Die Seite wird geladen...