André Laugks: Teilbaum sortieren und "neu schreiben"

Hallo!

Ich möchte ein Teilbaum sortieren und wieder "virtuell" in das XML-Dokument "neu schreiben"/"kopieren". Muß nicht an der selben Stelle ein.

Hintergrund ist eine Blätternfunktion.

Ich möchte mit vorname[position()>=1 and position<=2] nicht Ingo und Andre haben, sondern Andre und Dieter.

  
<root>  
   <foo>  
      <bar>FooBar</bar>  
   </foo>  
   <namen>  
     <eintrag>  
        <vornamen>Ingo</vorname>  
        <nachname>Schmidt</nachname>  
     </eintrag>  
     <eintrag>  
        <vornamen>Andre</vorname>  
        <nachname>Laugks</nachname>  
     </eintrag>  
     <eintrag>  
        <vornamen>Dieter</vorname>  
        <nachname>Meyer</nachname>  
     </eintrag>  
  </namen>  
</root>  

Nach der Sortierung.

  
<root>  
   <foo>  
      <bar>FooBar</bar>  
   </foo>  
   <namen>  
     <eintrag>  
        <vornamen>Andre</vorname>  
        <nachname>Laugks</nachname>  
     </eintrag>  
     <eintrag>  
        <vornamen>Dieter</vorname>  
        <nachname>Meyer</nachname>  
     </eintrag>  
     <eintrag>  
        <vornamen>Ingo</vorname>  
        <nachname>Schmidt</nachname>  
     </eintrag>  
  </namen>  
</root>  

Ich habe schon eine andere Lösung, würde es aber gern mit die hier gefragten Lösung machen, weil ich mit XPath noch herumwandern möchte um Daten zu selektieren.

  
<?xml version="1.0" encoding="ISO-8859-1"?>  
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
    <xsl:output method="xml" encoding="ISO-8859-1"/>  
    <xsl:template match="/root">  
        <html>  
            <body>  
  
                <table border="1">  
                    <tr>  
                        <td>Name</td>  
                    </tr>  
                    <xsl:apply-templates select="eintrag">  
                        <xsl:sort/>  
                    </xsl:apply-templates>  
                </table>  
  
            </body>  
        </html>  
    </xsl:template>  
  
    <xsl:template match="eintrag">  
       <xsl:if test="position() &gt;= 10 and position() &lt;= 19">  
        <tr>  
            <td><xsl:value-of select="vorname"/></td>  
        </tr>  
       </xsl:if>  
    </xsl:template>  
  
</xsl:stylesheet>  

André Laugks

--
Die Frau geht, die Hilti bleibt!
  1. Hi,

    ich könnte jetzt noch XQuery anbieten, wobei du dafür auch noch einen passenden Interpreter bräuchtest:
    XQuery -Order By-Clause
    Ordered Expressions

    MfG
    Rouven

    --
    -------------------
    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
  2. Hallo André,

    Ich möchte ein Teilbaum sortieren und wieder "virtuell" in das XML-Dokument "neu schreiben"/"kopieren". Muß nicht an der selben Stelle ein.

    Geht nicht.
    Nich in dasselbe XML und nicht mit XSLT 1.0
    Bei XSLT 2.0 könntest du mit einem temporären Baum arbeiten, z.B.:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       <xsl:output indent="yes" method="xml"/>
       <xsl:variable name="allnames">
          <xsl:for-each select="/root/namen/eintrag">
             <xsl:sort select="vorname"/>
             <xsl:copy-of select="."/>
          </xsl:for-each>
       </xsl:variable>
       <xsl:template match="/">
          <root>
             xsl:apply-templates/
          </root>
       </xsl:template>
        <xsl:template match="namen">
          <namen>
             <xsl:for-each select="$allnames/eintrag">
                <eintrag>
                   <vor_name><xsl:value-of select="vorname"/></vor_name>
                   <nach_name><xsl:value-of select="nachname"/></nach_name>
                </eintrag>
             </xsl:for-each>
          </namen>
       </xsl:template>
    </xsl:stylesheet>

    Hintergrund ist eine Blätternfunktion.
    Ich möchte mit vorname[position()&gt;=1 and position&lt;=2] nicht Ingo und Andre haben, sondern Andre und Dieter.
    Ich habe schon eine andere Lösung, würde es aber gern mit die hier gefragten Lösung machen, weil ich mit XPath noch herumwandern möchte um Daten zu selektieren.

    Was genau möchtest du machen?

    Grüße
    Thomas

    1. Hallo!

      Bei XSLT 2.0 könntest du mit einem temporären Baum arbeiten, z.B.:

      Das Wort "temporär" ist mir gestern nicht eingefallen. Das die XML-Datei mit XSLT nicht neu geschrieben werden kann, ist mir bewußt.

      Schade, ich muß mit der libxslt arbeiten muß und die kann leider noch kein XSLT 2.0... :-(

      Was genau möchtest du machen?

      In einer XML-Datei gibt es Einträge, die ich über einer Blätterfunktion darstellen möchte. Immer 10 Einträge pro Seite.

      << < 1 2 3 4 5 6 > >>

      Die jeweils aktuelle Seite übergebe ich mit einem Parameter.

      Ich komme da aber mit meinem Lösungsansatz zurecht. Deiner hätte mir besser gefallen.

      André

      1. Hallo André,

        Bei XSLT 2.0 könntest du mit einem temporären Baum arbeiten, z.B.:

        Das Wort "temporär" ist mir gestern nicht eingefallen. Das die XML-Datei mit XSLT nicht neu geschrieben werden kann, ist mir bewußt.

        Schade, ich muß mit der libxslt arbeiten muß und die kann leider noch kein XSLT 2.0... :-(
        Ich komme da aber mit meinem Lösungsansatz zurecht. Deiner hätte mir besser gefallen.

        Das kannst auch mit libxslt.
        Du kannst damit auf die Extension "exsl:node-set()" von exslt zurückgreifen:
        http://www.exslt.org/exsl/functions/node-set/index.html

        Grüße
        Thomas

        1. Hallo!

          Du kannst damit auf die Extension "exsl:node-set()" von exslt zurückgreifen:

          Ahhaa. Vielen Dank!

          André Laugks

          --
          Die Frau geht, die Hilti bleibt!