Anzeige

 Problem mit Sortierreihenfolge

erti01

Grünschnabel
#1
Hallo zusammen,

ich habe folgende xml-Datei

Code:
<?xml version="1.0" encoding="utf-8"?>
<Daten>
	<Eintrag ID="20110929000001" ZE1="Organisation" ZE2="Netzwerke pflegen" ZE3="">
		<Titel>Erstellung Geburtstagsliste</Titel>
		<Datum>29.11.2011</Datum>
		<Termin>0</Termin>
		<Status>offen</Status>
	</Eintrag>
	<Eintrag ID="20111206100442" ZE1="SG" ZE2="TuA" ZE3="">
		<Titel>Kontaktdaten</Titel>
		<Datum>12.12.2011</Datum>
		<Termin>2</Termin>
		<Status>neu</Status>
		<Dokument ID="20111206100555">
			<Datum>01.12.2011</Datum>
			<Originalname>AW: E-Titel </Originalname>
			<Originalpfad/>
			<Pfad>\Cockpit2_Dateien\20111206100555---AW_E-Titel.msg</Pfad>
			<Name>AW: E-Titel angepasst </Name>
			<Suchwort/>
			<Version>1</Version>
		</Dokument>
	</Eintrag>
	<Eintrag ID="20111205130302" ZE1="SAS" ZE2="Projekt" ZE3="">
		<Titel>TuA-Paket</Titel>
		<Datum>17.01.2012</Datum>
		<Termin>40886</Termin>
		<Status>erledigt</Status>
		<Kommentar ID="20111205130416">
			<Datum>05.12.2011</Datum>
			<Text>Was ist Umfang der Lieferung</Text>
		</Kommentar>
	</Eintrag>
	<Eintrag ID="20111205130124" ZE1="SAS" ZE2="Projekt" ZE3="">
		<Titel>Testbewertung</Titel>
		<Datum>16.01.2012</Datum>
		<Termin>40885</Termin>
		<Status>erledigt</Status>
		<Dokument ID="20111206100922">
			<Datum>03.12.2011</Datum>
			<Originalname>laufende Tests</Originalname>
			<Originalpfad/>
			<Pfad>\Cockpit2_Dateien\20111206100922---laufende Tests.msg</Pfad>
			<Name>Tests</Name>
			<Suchwort/>
			<Version>3</Version>
		</Dokument>
		<Kommentar ID="20111205130149">
			<Datum>05.12.2011</Datum>
			<Text>Rücksprache</Text>
		</Kommentar>
		<Dokument ID="20111206101921">
			<Datum>05.12.2011</Datum>
			<Originalname>Ergebnisse</Originalname>
			<Originalpfad/>
			<Pfad>\Cockpit2_Dateien\20111206101921---Ergebnisse.msg</Pfad>
			<Name>Ergebnisse</Name>
			<Suchwort/>
			<Version>5</Version>
		</Dokument>
		<Dokument ID="20111206100922">
			<Datum>02.12.2011</Datum>
			<Originalname>Tests</Originalname>
			<Originalpfad/>
			<Pfad>\Cockpit2_Dateien\20111206100922---Tests.msg</Pfad>
			<Name>Tests2</Name>
			<Suchwort/>
			<Version>2</Version>
		</Dokument>
		<Kommentar ID="20111208160533">
			<Datum>08.12.2011</Datum>
			<Text>Neue Tests</Text>
		</Kommentar>
	</Eintrag>
</Daten>
und will mit folgendem xslt
Code:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:strip-space elements="*"/>
  <xsl:output method="xml" indent="yes"/>

   <xsl:template match="Daten">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()">
			<xsl:sort select="Termin" data-type="number"/>
     </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
  
  <xsl:template match="Daten/Eintrag">
    <xsl:copy>
      <xsl:apply-templates  select="@* | node()">
           <xsl:sort select="Version" order="descending" data-type="number"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
  
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
  
</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:
<?xml version="1.0" encoding="utf-8"?>
<Daten>
  <Eintrag ID="20110929000001" ZE1="Organisation" ZE2="Netzwerke pflegen" ZE3="">
    <Titel>Erstellung Geburtstagsliste</Titel>
    <Datum>29.11.2011</Datum>
    <Termin>0</Termin>
    <Status>offen</Status>
  </Eintrag>
  <Eintrag ID="20111206100442" ZE1="SG" ZE2="TuA" ZE3="">
    <Titel>Kontaktdaten</Titel>
    <Datum>12.12.2011</Datum>
    <Termin>2</Termin>
    <Status>neu</Status>
    <Dokument ID="20111206100555">
      <Datum>01.12.2011</Datum>
      <Originalname>AW: E-Titel </Originalname>
      <Originalpfad />
      <Pfad>\Cockpit2_Dateien\20111206100555---AW_E-Titel.msg</Pfad>
      <Name>AW: E-Titel angepasst </Name>
      <Suchwort />
      <Version>1</Version>
    </Dokument>
  </Eintrag>
  <Eintrag ID="20111205130124" ZE1="SAS" ZE2="Projekt" ZE3="">
    <Titel>Testbewertung</Titel>
    <Datum>16.01.2012</Datum>
    <Termin>40885</Termin>
    <Status>erledigt</Status>
    <Kommentar ID="20111205130149">
      <Datum>05.12.2011</Datum>
      <Text>Rücksprache</Text>
    </Kommentar>
    <Kommentar ID="20111208160533">
      <Datum>08.12.2011</Datum>
      <Text>Neue Tests</Text>
    </Kommentar>
    <Dokument ID="20111206100922">
      <Datum>02.12.2011</Datum>
      <Originalname>Tests</Originalname>
      <Originalpfad />
      <Pfad>\Cockpit2_Dateien\20111206100922---Tests.msg</Pfad>
      <Name>Tests2</Name>
      <Suchwort />
      <Version>2</Version>
    </Dokument>
    <Dokument ID="20111206100922">
      <Datum>03.12.2011</Datum>
      <Originalname>laufende Tests</Originalname>
      <Originalpfad />
      <Pfad>\Cockpit2_Dateien\20111206100922---laufende Tests.msg</Pfad>
      <Name>Tests</Name>
      <Suchwort />
      <Version>3</Version>
    </Dokument>
    <Dokument ID="20111206101921">
      <Datum>05.12.2011</Datum>
      <Originalname>Ergebnisse</Originalname>
      <Originalpfad />
      <Pfad>\Cockpit2_Dateien\20111206101921---Ergebnisse.msg</Pfad>
      <Name>Ergebnisse</Name>
      <Suchwort />
      <Version>5</Version>
    </Dokument>
  </Eintrag>
  <Eintrag ID="20111205130302" ZE1="SAS" ZE2="Projekt" ZE3="">
    <Titel>TuA-Paket</Titel>
    <Datum>17.01.2012</Datum>
    <Termin>40886</Termin>
    <Status>erledigt</Status>
    <Kommentar ID="20111205130416">
      <Datum>05.12.2011</Datum>
      <Text>Was ist Umfang der Lieferung</Text>
    </Kommentar>
  </Eintrag>
</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
 

deepthroat

Erfahrenes Mitglied
#2
Hi.

Welchen XSLT Prozessor verwendest du denn?

Bei mir funktioniert dein Stylesheet nach einer kleinen Änderung wie vergesehen:
XML:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:strip-space elements="*"/>
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="Daten">
    <xsl:copy>
      <xsl:apply-templates  select="@*" />
      <xsl:apply-templates  select="node()">
        <xsl:sort select="Termin" data-type="number"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Daten/Eintrag">
    <xsl:copy>
      <xsl:apply-templates  select="@*" />
      <xsl:apply-templates  select="node()">
        <xsl:sort select="Version" order="descending" data-type="number"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

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

</xsl:stylesheet>
 
Zuletzt bearbeitet von einem Moderator:

erti01

Grünschnabel
#3
Hi,

ich nutze folgenden Code in vb.net

Code:
Imports System.Xml
Imports System.Xml.Xsl
Imports System.Xml.XPath
Imports System.Xml.Linq
Imports System.Runtime.CompilerServices

Module Module1


    Function Main(ByVal cmdArgs() As String) As Integer

        Dim returnValue As Integer = 0
        If cmdArgs.Length <> 3 Then
            Console.WriteLine("Aufruf eingabe.xml ausgabe.xml transform.xsl")
            returnValue = 1
            Return returnValue
        Else
            Console.WriteLine(cmdArgs(0) & " => " & cmdArgs(2) & " => " & cmdArgs(1))
        End If

        Dim xslt As New XslCompiledTransform
        Try
            xslt.Load(cmdArgs(2))
        Catch ex As Exception
            Console.WriteLine("Fehler bei Laden Transformationsbeschreibung")
            Console.WriteLine(ex.ToString)
            Console.WriteLine(ex.Message.ToString)
            returnValue = 2
            Return returnValue
        End Try

        Try
            xslt.Transform(cmdArgs(0), cmdArgs(1))
        Catch ex As Exception
            Console.WriteLine("Fehler bei Transformation")
            Console.WriteLine(ex.ToString)
            Console.WriteLine(ex.Message.ToString)
            returnValue = 3
            Return returnValue
        End Try
        Return returnValue
    End Function

End Module
Ich habe deine Änderung eingefügt und jetzt funktioniert es.

Vielen DANK
Thomas
 
Anzeige

Neue Beiträge

Anzeige