Announcement

Collapse
No announcement yet.

Problem mit CSS2XPath - class:nth-child(2) oder id:nth-child(2)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem mit CSS2XPath - class:nth-child(2) oder id:nth-child(2)

    Hallo,

    ich benötige für eine XSLT Transformation CSS-Selectoren als XPath-Ausdrücke.
    Ich habe nun Probleme bei den CSS-Selectoren class:nth-child(2) oder id:nth-child(2), Beispiel: .test .testen:nth-child(2).

    Ich habe bis jetzt verschiedene Sachen ausprobiert, bis jetzt hat das aber leider nicht geklappt:
    Code:
    //*[contains(concat(' ',@class,' '),concat(' ','test',' '))]//*[2][contains(concat(' ',@class,' '),concat(' ','testen',' '))]
    //*[contains(concat(' ',@class,' '),concat(' ','test',' '))]//*[contains(concat(' ',@class,' '),concat(' ','testen',' '))][position()=2]
    Die HTML-Struktur die ich als Grundlage nehme sieht folgendermaßen aus:
    Code:
    <div class="testclass">
     <div class="testclass2">
      <div>
       <div id="testclass">
        <div class="test">
         <a></a>
         <p></p>
        </div>
       </div>
      </div>
     </div>
     <div class="testclass2">
      <div>
       <div>
        <div class="test">
         <a></a>
         <p></p>
        </div>
       </div>
      </div>
     </div>
    </div>
    Ich möchte eigentlich ungeachtet der Struktur das zweite div mit der Klasse 'test' mit oben angesprochenen XPath-Audruck auswählen können.

    Ich hoffe ich hab mich einigermaßen verständlich ausgedrückt

    Vielen Dank schon mal!
    Alex

  • #2
    Probiere es mit diesem Ansatz:

    //div[@class='test' and count(ancestor-or-self::div[@class='test']) + count(preceding::div[@class='test']) = 2]

    Comment


    • #3
      Hi Thomas,

      danke für deine Antwort, leider funktioniert das so nicht...hast du vielleicht noch ne andere Idee?

      Originally posted by Thomas Meinike View Post
      Probiere es mit diesem Ansatz:

      //div[@class='test' and count(ancestor-or-self::div[@class='test']) + count(preceding::div[@class='test']) = 2]

      Comment


      • #4
        Ich habe es probiert und erhalte für obige Struktur das gesuchte div-Element (ausgehend vom Wurzel-div).

        Comment


        • #5
          Hab's jetzt auch noch mal ausprobiert und es funktioniert zwar, aber ich glaub ich hab mich nicht richtig ausgedrückt.
          Hier noch mal nen neuer Versuch...

          Code:
          <div>
          
           <div class="testclass1">
            <div>
             <div>
              <div class="test">
                <a></a>
                <p></p>
               </div>
              </div>
              <div>
               <div class="test">
                <a></a>
                <p></p>
               </div>
              </div>
          ...
             </div>
            </div>
          
           <div class="testclass2">
            <div>
             <div>
              <div class="test">
                <a></a>
                <p></p>
               </div>
              </div>
              <div>
               <div class="test">
                <a></a>
                <p></p>
               </div>
              </div>
          ...
             </div>
            </div>
          
           <div class="testclass3">
            <div>
             <div>
              <div class="test">
                <a></a>
                <p></p>
               </div>
              </div>
              <div>
               <div class="test">
                <a></a>
                <p></p>
               </div>
              </div>
          ...
             </div>
            </div>
          
           </div>
          Hab die Struktur etwas geändert. Ich möchte aus dem div "testclass3" oder "testcalss1", etc. irgendein nth-child mit class="test" auswählen. Der XPath den Du mir geschickt hast funktioniert nur bei dem div "testclass1", hab's auch schon mal so probiert, funktioniert nur leider auch nicht:

          Code:
          //*[contains(concat(' ',@class,' '),concat(' ','testclass2',' '))]//div[@class='test' and count(ancestor-or-self::div[@class='test']) + count(preceding::div[@class='test']) = 2]
          Danke

          Originally posted by Thomas Meinike View Post
          Ich habe es probiert und erhalte für obige Struktur das gesuchte div-Element (ausgehend vom Wurzel-div).

          Comment


          • #6
            Da mir der Anwendungskontext fehlt, vielleicht reicht schon etwas in dieser Richtung:
            //div[@class="testclass1"]//div[@class="test"]

            Comment


            • #7
              Ich hab das nun so gemacht...
              Code:
              //*[contains(concat(' ',@class,' '),concat(' ','testclass1',' '))]//div[@class='test' and (count(preceding::div[@class='test'])+1) = ((count(//div[contains(concat(' ',@class,' '),concat(' ','testclass1',' '))]//preceding::div[contains(concat(' ',@class,' '),concat(' ','test',' '))])) - (count(//*[contains(concat(' ',@class,' '),concat(' ','testclass1',' '))]//div[contains(concat(' ',@class,' '),concat(' ','test',' '))])))+3]
              Das klappt auch so ganz gut, nur weiß ich nicht ob es ein wenig umständlich ist bzw. es vielleicht eine kürzere Variante gibt!?


              Originally posted by Thomas Meinike View Post
              Da mir der Anwendungskontext fehlt, vielleicht reicht schon etwas in dieser Richtung:
              //div[@class="testclass1"]//div[@class="test"]

              Comment


              • #8
                Ich hab das nun so gemacht...
                Code:
                //*[contains(concat(' ',@class,' '),concat(' ','testclass1',' '))]//div[@class='test' and (count(preceding::div[@class='test'])+1) = ((count(//div[contains(concat(' ',@class,' '),concat(' ','testclass1',' '))]//preceding::div[contains(concat(' ',@class,' '),concat(' ','test',' '))])) - (count(//*[contains(concat(' ',@class,' '),concat(' ','testclass1',' '))]//div[contains(concat(' ',@class,' '),concat(' ','test',' '))])))+3]
                Die drei steht hierbei für das dritte Element unter 'testclass1' mit der class 'test'.
                Das klappt auch so ganz gut, nur weiß ich nicht ob es ein wenig umständlich ist bzw. es vielleicht eine kürzere Variante gibt!?


                Originally posted by Thomas Meinike View Post
                Da mir der Anwendungskontext fehlt, vielleicht reicht schon etwas in dieser Richtung:
                //div[@class="testclass1"]//div[@class="test"]

                Comment

                Working...
                X