2016-09-17 2 views
0

Wenn der Kontext auf Division/Division/* Thema zeigt, wollte ich alle Themen Tags unter body/division zählen und auch Ergebnis der Zählung der vorherigen body/division/division-Tag hinzufügen.XPATH: Count Preceding Div-Element

Output = Alle Themen unter Körper/Division + Anzahl der Körper/Abteilung/Division

<?xml version="1.0" encoding="UTF-8"?> 
    <body> 
     <division> 
      <Atopic><longtitle>TitleDiv1 Atopic</longtitle></Atopic> 
      <Btopic><longtitle>TitleDiv1 Btopic</longtitle></Btopic> 
      <Ctopic><longtitle>TitleDiv1 Ctopic</longtitle></Ctopic> 
      <division> 
      <Atopic><longtitle>TitleDiv1.1 Atopic</longtitle></Atopic> 
      </division> 
      <division> 
       <Atopic><longtitle>TitleDiv1.2 Atopic</longtitle></Atopic> 
      </division> 
     </division> 
     <division> 
      <Atopic><longtitle>TitleDiv2 Atopic</longtitle></Atopic> 
      <Dtopic><longtitle>TitleDiv2 Dtopic</longtitle></Dtopic> 
      <division> 
      <Atopic><longtitle>TitleDiv2.1 Atopic</longtitle></Atopic> 
      </division> 
      <division> 
      <Ctopic><longtitle>TitleDiv2.2 Ctopic</longtitle></Ctopic> 
      </division> 
     </division> 
    </body> 

So zum Beispiel

  1. Wenn mein Kontext in Div 1/2 ist, die Logik sollte Zählen Sie alle * Themen unter body/division1. Also sollte es 3 (Atopic, Btopic, Ctopic) zurückgeben. Hier gibt es kein vorangestelltes Body/Division/Division-Element. So o/p = 3 + 0 = 3
    2. Ähnlich von Div1/3 sollte es zählen die * Themen unter body/division-Tag, d. H. 3 und zählen auch vorhergehende body/div/div (d. H. 3 + 1 = 4).

  2. Wenn der Kontext Div2/1 ist, sollte der Zähler nur die * Themen unter body/division2 berücksichtigen.
    Also, wenn ich die Logik von Div2/1 Atopic verwende, sollte es "2" zurückgeben, da Div2-Tag (Körper/Division) 2 Themen und keine vorhergehenden Körper/Div/Div hat. Ausgabe = 2. Hier sollte der vorhergehende Körper/Division/Division für Div2-Tag berücksichtigt werden und Div1's Körper/Division/Division sollte nicht berücksichtigt werden. Kurz gesagt sollte der Körper/Division/Division zurückgesetzt werden, wenn neue Körper/Division auftritt.

pls beratung.

+0

Wie unterscheidet sich das von Ihrer vorherigen Frage: http://stackoverflow.com/questions/39531286/xpath-get-preceding-childrens –

+0

P. S. Ihr Beispiel wäre viel klarer, wenn (a) die Divisionen ein eindeutiges ID-Attribut hätten und (b) die Themen eindeutige Namen hätten und (c) es richtig eingerückt wäre. Es ist auch nicht klar, was genau '.... DIV 1 ......' usw. sein sollen; Wenn sie Elemente sind, warum macht ihr sie nicht zu Elementen? –

+0

hallo Michael, der Unterschied ist, ich muss auch Division/Division zu * topic, d. H. "Zählen (Vorfahren :: division [last()]/* [contains (name(), 'topic')])". Ihr Sol war vollkommen in Ordnung, wenn Sie die * Themen unter Body/Division betrachten. Aber ich brauche auch division/division, das zur Zählung hinzugefügt werden soll (ancestor :: division [last()]/* [contains (name(), 'topic']] result, so dass im context 1/3 zurückgegeben wird (3 Themen unter body/div und 1 div/div = 4) –

Antwort

1

ich nur raten hier, aber es scheint mir, Sie wollen:

<xsl:value-of select="count(ancestor::division[last()]/*[contains(name(), 'topic')]) + count(../preceding-sibling::division)"/> 

Ungeprüfte, weil ich weiß nicht, wie das gegen den Code zu testen.

+0

Sorry Michael, Graf (vorhergehende Geschwister :: Division) zurück 0 überall. Die logische Anzahl (Vorgänger :: division [last()]/* [contains (name(), 'topic')]) funktioniert gut für die Anforderung. Aber alles, was ich haben wollte, ist das vorherige Div/Div-Tag zu zählen. Ich habe versucht, mit count (vorhergehende :: division [parent :: division]), aber es fügt die Anzahl der div/div Elemente von DIV1 zu dem Ergebnis von DIV2.Bitte helfen, ich bin etwas verloren in diesem –

+0

Ich habe Änderungen an der XML vorgenommen, die Beispiel-XML hat keine Attribute. –

+0

Siehe die Bearbeitung meines Posts. –

Verwandte Themen