Christian S.: XPath. Teilmenge selektieren.

Hi,

ich suche nach einer XPath Anweisung, mit der ich z.B. Die Knoten 3-5 selektieren kann.

Also beispielsweise:

<root>
   <objekt>
      <test>wert</test>
   </objekt>
   <objekt>
      <test>wert1</test>
   </objekt>
   <objekt>
      <test>wert2</test>
   </objekt>
   <objekt>
      <test>wert3</test>
   </objekt>
   <objekt>
      <test>wert4</test>
   </objekt>
   <objekt>
      <test>wert5</test>
   </objekt>
</root>

Davon hätte ich gerne die <objekt>-Knoten 3-5 z.B.

Wie sähe der XPath String dazu aus?

Danke!

Gruß!

  1. Hallo Christian,

    ich suche nach einer XPath Anweisung, mit der ich z.B. Die Knoten 3-5 selektieren kann.

    Am Beispiel der Ausgabe einer ul-Liste in HTML demonstriert:

    <xsl:template match="root">  
      <ul>  
        <xsl:apply-templates select="objekt[position() &gt;= 3 and position() &lt;= 5]"/>  
      </ul>  
    </xsl:template>  
      
    <xsl:template match="objekt">  
      <li><xsl:value-of select="."/></li>  
    </xsl:template>
    

    Ergebnis:

    <ul>  
      <li>wert2</li>  
      <li>wert3</li>  
      <li>wert4</li>  
    </ul>
    

    Grüße,
    Thomas

    1. Besten dank! Klappt!

    2. Ok... ich habe das nächste Problem:

      folgendes beispielhaftes XML Dokument:

        
      <?xml version="1.0" encoding="ISO-8859-1"?>  
        
      <bookstore>  
      <book category="COOKING">  
        <title lang="en">Everyday Italian</title>  
      </book>  
        
      <book category="CHILDREN">  
        <title lang="en">Harry Potter</title>  
      </book>  
        
      <book category="WEB">  
        <title lang="en">XQuery Kick Start</title>  
      </book>  
        
      <book category="WEB">  
        <title lang="en">Learning XML</title>  
      </book>  
      </bookstore>  
      
      

      Nun möchte ich alle Knoten selektieren, die im <title> den String "X" enthalten.

      Ginge ja mit: /bookstore/book/title[contains(., 'X')]

      Aber ich möchte aus dieser Ergebnismenge, wieder nur die ersten 5 zum Beispiel haben, bzw. die von 5-10.

      Wie mach ich das?

      Gruß!

      1. Hallo Christian,

        Nun möchte ich alle Knoten selektieren, die im <title> den String "X" enthalten.

        Ginge ja mit: /bookstore/book/title[contains(., 'X')]

        Aber ich möchte aus dieser Ergebnismenge, wieder nur die ersten 5 zum Beispiel haben, bzw. die von 5-10.

        [...]-Prädikate lassen sich kombinieren:

        <xsl:template match="bookstore">  
          <xsl:apply-templates select="book/title[contains(., 'X')][position() &gt;= 5 and position() &lt;= 10]"/>  
        </xsl:template>  
          
        <xsl:template match="title">  
          <!-- Verarbeitung der Inhalte -->  
        </xsl:template>
        

        Grüße,
        Thomas

        1. Hi,

          [code lang=xml]<xsl:template match="bookstore">
            <xsl:apply-templates select="book/title[contains(., 'X')][position() &gt;= 5 and position() &lt;= 10]"/>
          </xsl:template>

          das dachte ich auch erst. Funktioniert aber nicht. Das position() bezieht sich hier einfach nur auf den <title> Knoten.

          Habe es mal hier getestet:
          http://www.futurelab.ch/xmlkurs/xpath.en.html

          Dort am Beispiel

          /booklist/book/isbn[contains(., '55')][position() = 1]

          getestet. Es kommen immer beide Ergebnisse. Bei position() != 1 kommt gar nichts.

          Gruß!

          1. Ok. Habs.

            /booklist/book/isbn[contains(., '55')][position() = 1]

            man muss noch runde Klammern drum machen.

            (/booklist/book/isbn[contains(., '55')])[position() = 1]

            Gruß!