Wie, um die Anzahl der demselben unmittelbar vorhergehenden Geschwister in xsl
Ich bin mit der xslt-version 2, die ich versuche zu transformieren xml-Daten in eine fo-Ausgabe, und ich bin stecken, auf eine bestimmte Problematik.
Hier ist, was aussieht wie mein input:
<a1/>
<a1/>
<b/>
<c/>
<d/>
<a2/>
<b/>
<c/>
<a1/>
<a1/>
<a1/>
<a1/>
<b/>
<c/>
<d/>
Diese Daten, funktional spricht, enthält eine Liste von 'sets' (definiert durch a1|a2,b?,c?,d?.
Mein problem ist, dass ich nicht sehen, wie kann ich die Anzahl der a1-tags für ein bestimmtes "set".
In der Tat, ich habe geschrieben das mein xsl und ich bekomme eine Ausgabe wie:
<fo:table>
<fo:row>
<fo:cell>b: </fo:cell>
<fo:cell>b value</fo:cell>
</fo:row>
<fo:row>
<fo:cell>a1: </fo:cell>
<fo:cell>number of a1 ???</fo:cell> <-- what I am trying to retrieve
</fo:row>
<fo:row>
...
</fo:row>
...
</fo:table>
Habe ich getan ein apply-template auf a1+|a2-tags, und ich nichts tun, wenn a1-tag hat folgende Geschwister, die gleich a1.
Ich denke, es muss ein Weg gefunden werden, zählen die tags, die mit vorangehenden Geschwister (aber dann, wie um sich zu versichern, zählen nur die entsprechenden?)
Irgendwelche Tipps wäre dankbar!
Bearbeiten:
Auf das obige Beispiel der Eingang, die erste Zählung sollte 2:
<a1/>
<a1/>
<b/>
<c/>
<d/>
dann sollte es 4 und nicht 6:
<a1/>
<a1/>
<a1/>
<a1/>
<b/>
<c/>
<d/>
InformationsquelleAutor skoll | 2013-07-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Frage ist nicht wirklich klar.
Was soll "die entsprechende" werden?
Zählt man alle
a1
vor wäre:falls erforderlich, ergänzen Sie Prädikate wie:
Zählen nur der Vorsitzende Geschwister-a1, die in einer Sequenz der a1-Knoten versuchen, diese:
Hier finden Sie den ersten Knoten, die nicht in der a1.
Den doch als Ergebnis, ist zählen alle Knoten vor dem aktuellen a1 minus der Anzahl der Knoten, die vor dem ersten nicht a1 + dieser Knoten selbst.
Oder ohne variable:
Ok, ich sehe, bitte haben Sie einen Blick auf das update.
Es ist fast ok, aber es gibt 3 statt 4 für den 1. Satz...
Sicher, es zählt nur die Vorgänger-Geschwister. Wenn Sie wollen, die zählen, einschließlich der selbständigen Beurteilung
+1
: "select="count(..) - count(..) +1"Ok, das ist es, mein Fehler war ich habe nicht verstanden | $firstnota1, also ignorierte ich es. Stattdessen musste ich es entfernen und dann hinzufügen 1. So ist es behandelt beide Fälle : mit oder ohne anderen vorherigen Geschwister.
InformationsquelleAutor hr_117
Ich würde
for-each-group group-adjacent="boolean(self::a1)">
z.B.Wenn die Eingabe
dann Saxon 9 Ausgänge
Count is: 2Count is: 4
so gibt es die zahlen, die Sie wollen (schlecht formatiert, zugegeben). Wenn Sie nicht bekommen, jede Ausgabe dann vielleicht die Elemente, die Sie gepostet haben, haben ein anderes übergeordnetes element als die, die ich gewählt habe (d.h.root
). Oder Sie verwenden namespaces, und dieself::a1
angepasst werden.Ich werde Bearbeiten Sie die Antwort, um zu zeigen, Ihnen ein Beispiel.
Ok +1 Fehler von mir ich habe versucht, verwenden Sie die foreach-Gruppe im element, nicht Eltern. Aber ich bin Anzeige 421 - 421 - 421 statt 4 - 2 - 1... Es scheint, dass der test-test="current-grouping-key()" ist immer gültig ?
Nein, vergiss es einfach. Es ist ein Unterschied in der Konzeption: ich Baue ein fo-Tabelle von a1, mit für-jeden-Gruppe, die ich aufbauen sollte, es von den Eltern. vielen Dank für die Erklärungen.
Naja... vielleicht vergessen Sie es nicht 🙂 glaubst du es gibt einen Weg, um Werte abzurufen, die von Gruppen von (a1+,b?,c?,d???) Mit for-each-group zu sein scheint, wirklich sauberer als meine Lösung
InformationsquelleAutor Martin Honnen
Versuchen Sie folgenden xpath -
Es bedeutet: Anzahl der vorhergehenden a1-an alle minus-Zählung von a1 vorhergehenden früheren b
b, c und d sind optionnal (xsd-so sagt), ich werde versuchen zu finden, wenn es wirklich optionnal oder wenn meine Daten enthalten immer eine bestimmte (wenn nicht, gibt es eine Möglichkeit zu finden, die max Graf(vor-sibling::b - [1]/vor-sibling::a1) / gleich mit c / gleichen mit d ?)
Sie speichern könnte der name des aktuellen Elements in Variablen
<xsl:variable name="nodeName" select="name()" />
und dann im zweiten Zählung<xsl:value-of select="count(preceding-sibling::a1)-count(preceding-sibling::node()[name()=$nodeName][1]/preceding-sibling::a1)" />
InformationsquelleAutor Jirka Š.