2012-03-31 13 views
2

Die Struktur meiner Stylesheet einen Zähler der Verbindung Muster in xsl zu bekommen, ist wie folgt:Versuchen

<xsl:apply-templates select="pattern1|pattern2|pattern3"/> 
     ... 
    <xsl:template match="pattern1|pattern2|pattern3"> 
     <xsl:variable name="counter"> 
      <xsl:number/> 
     </xsl:variable> 
     ... 
    </xsl:template> 

Die Zähler Variable für jedes Muster zurückgesetzt werden. Ich möchte für alle Spiele einen Zähler bekommen. Wie kann ich es erreichen? Danke!

XML-Quellstruktur wie folgt:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <div class="entry"> 
     <div class="headword"> 
      ... 
     </div> 
     <div class="information-forms"> 
      test infomation block 
     </div> 
     <div class="definition"> 
      <div>text </div> 
      <div>text </div> 
        ... ... 
      <div>text </div> 
     </div> 
     <div class="example-sentences"> 
      <ol> 
       <li>sentence here</li> 
       <li>sentence here</li> 
      ... ... 
       <li>sentence here</li> 
      </ol> 
     </div> 
     <div class="synonyms-reference"> 
      <div class="syn-para"> 
       Synonyms: ... ... 
      </div> 
      <div class="ant-para"> 
       Antonyms: ... ... 
      </div> 
     <div class="..."> 
       ... 
     </div> 
     </div> 
    </div> 
    <div class="entry"> 
     ... 
    </div> 
    <div class="entry"> 
     ... 
    </div> 
    ... ... 
</root> 

Ich möchte einen Zähler von Knoten von mehreren Mustern unter jedem div [@ class = "Eintrag"] bekommen Knoten.

So sollte der Zähler zurückgesetzt werden, wenn in einem neuen div [@ class = "entry"] Knoten gestartet wird. XPath des Musters

div[@class='information-forms'] 
| 
div[@class='definition'].div 
| 
div[@class='example-sentences']/ol/li 

ist, kann ich herausfinden, wie es zu tun, indem sie zweimal mit XSL-Stylesheet analysieren. (Zum ersten Mal all passenden Knoten in einem Knoten gesetzt.), Aber es scheint mir, dass es in einem einzigen Durchgang durchgeführt werden. Ich hoffe, dass jemand mit Erfahrung in XSL/XSLT mir helfen kann. Vielen Dank.

+0

Bitte, ein komplettes Beispiel geben - ein komplettes (so klein wie möglich) XML-Dokument, das gewünschte Ergebnis genau und die Regeln dass die Transformation implementieren muss. Es ist nicht ganz klar, welchen Wert Sie in der Variablen haben möchten - bitte editieren Sie die Frage und zeigen Sie dies explizit an - sonst müssen die Leute raten und die Korrektheit der Antworten wäre zufällig. –

Antwort

0

Versuchen Sie, die folgenden. Erläuterung: Rufen Sie eine bestimmte Vorlage für die Menge der zu verarbeitenden Knoten auf und geben Sie die Menge als Parameter an. Verwenden Sie dann position() innerhalb der Vorlage.

<xsl:template match="div[@class='entry']"> 
    <div> 
     <xsl:variable name="divs" select=" 
     div[@class='information-forms'] 
     | 
     div[@class='definition']/div 
     | 
     div[@class='example-sentences']/ol/li 
     "/> 
     <xsl:call-template name="divs"> 
      <xsl:with-param name="divs" select="$divs"/> 
     </xsl:call-template> 
    </div> 
</xsl:template> 



<xsl:template name="divs"> 
    <xsl:param name="divs"/> 
    <xsl:for-each select="$divs"> 
     <pos><xsl:value-of select="position()"/></pos> 
    </xsl:for-each> 
</xsl:template> 

Mit dem XML-Eingabe Sie geliefert, gibt dieses Ergebnis als

<?xml version="1.0" encoding="UTF-8"?> 
<out> 
    <div> 
     <pos>1</pos> 
     <pos>2</pos> 
     <pos>3</pos> 
     <pos>4</pos> 
     <pos>5</pos> 
     <pos>6</pos> 
     <pos>7</pos> 
    </div> 
    <div/> 
    <div/> 
</out> 
0

Verwenden geeignete Weise der count und level Attribute xsl:number wie in der folgenden Transformation:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match= 
    "*[starts-with(name(), 'A') and contains(name(), '.')] 
    | 
    *[starts-with(name(), 'B') and contains(name(), '.')] 
    | 
    *[starts-with(name(), 'C') and contains(name(), '.')] 
    "> 
    <X oldname="{name()}"> 
    <xsl:number level="any" count= 
    "*[starts-with(name(), 'A') and contains(name(), '.')] 
    | 
    *[starts-with(name(), 'B') and contains(name(), '.')] 
    | 
    *[starts-with(name(), 'C') and contains(name(), '.')] 
    "/> 
    <xsl:apply-templates/> 
    </X> 
    </xsl:template> 
</xsl:stylesheet> 

Wenn diese Transformation auf dem folgende XML-Dokument angewandt wird:

<t> 
    <A> 
     <A.1> 
      <A.1.1/> 
      <A.1.2/> 
     </A.1> 
     <A.2> 
      <A.2.1/> 
     </A.2> 
     <A.3/> 
    </A> 
    <B> 
     <B.1/> 
     <B.2> 
      <B.2.1/> 
      <B.2.2> 
       <B.2.2.1/> 
       <B.2.2.2/> 
      </B.2.2> 
     </B.2> 
    </B> 
    <C> 
     <C.1/> 
     <C.2> 
      <C.2.1/> 
      <C.2.2> 
       <C.2.2.1/> 
       <C.2.2.2/> 
      </C.2.2> 
     </C.2> 
    </C> 
</t> 

die gewünschtes korrektes Ergebnis (absolute Nummerierung für alle Elemente dessen Namen enthält ".") wird hergestellt:

<t> 
    <A> 
     <X oldname="A.1">1 
      <X oldname="A.1.1">2</X> 
      <X oldname="A.1.2">3</X></X> 
     <X oldname="A.2">4 
      <X oldname="A.2.1">5</X></X> 
     <X oldname="A.3">6</X> 
    </A> 
    <B> 
     <X oldname="B.1">7</X> 
     <X oldname="B.2">8 
      <X oldname="B.2.1">9</X> 
      <X oldname="B.2.2">10 
       <X oldname="B.2.2.1">11</X> 
       <X oldname="B.2.2.2">12</X></X></X> 
    </B> 
    <C> 
     <X oldname="C.1">13</X> 
     <X oldname="C.2">14 
      <X oldname="C.2.1">15</X> 
      <X oldname="C.2.2">16 
       <X oldname="C.2.2.1">17</X> 
       <X oldname="C.2.2.2">18</X></X></X> 
    </C> 
</t> 

aktualisieren: Die OP wurde eine Probe XML-Dokument bereitgestellt NOE und klargestellt, dass die Numerierung in jeder div[@class='entry] zurückgesetzt werden müssen.

Lösung:

Diese Transformation:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*" name="identity"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match= 
    "div[@class='information-forms'] 
    | 
    div[@class='definition']/div 
    | 
    div[@class='example-sentences']/ol/li 
    "> 
    <xsl:number level="any" 
    count="div[@class='information-forms'] 
       | 
       div[@class='definition']/div 
       | 
       div[@class='example-sentences']/ol/li" 
    from="div[@class='entry']"/> 

    <xsl:call-template name="identity"/> 
</xsl:template> 
</xsl:stylesheet> 

wenn auf dem folgenden XML-Dokument angewendet:

<root> 
    <div class="entry"> 
     <div class="headword"> 
       ... 
     </div> 
     <div class="information-forms"> 
       test infomation block 
     </div> 
     <div class="definition"> 
      <div>text </div> 
      <div>text </div> 
         ... ... 
      <div>text </div></div> 
     <div class="example-sentences"> 
      <ol> 
       <li>sentence here</li> 
       <li>sentence here</li> 
       ... ... 
       <li>sentence here</li> 
      </ol> 
     </div> 
     <div class="synonyms-reference"> 
      <div class="syn-para"> 
        Synonyms: ... ... 
      </div> 
      <div class="ant-para"> 
        Antonyms: ... ... 
      </div> 
      <div class="..."> 
        ... 
      </div></div></div> 
    <div class="entry"> 
      ... 
    </div> 
    <div class="entry"> 
     <div class="headword"> 
       ... 
     </div> 
     <div class="information-forms"> 
       test infomation block 
     </div> 
     <div class="definition"> 
      <div>text </div> 
      <div>text </div> 
         ... ... 
      <div>text </div></div> 
     <div class="example-sentences"> 
      <ol> 
       <li>sentence here</li> 
       <li>sentence here</li> 
       ... ... 
       <li>sentence here</li> 
      </ol> 
     </div> 
     <div class="synonyms-reference"> 
      <div class="syn-para"> 
        Synonyms: ... ... 
      </div> 
      <div class="ant-para"> 
        Antonyms: ... ... 
      </div> 
      <div class="..."> 
        ... 
      </div></div></div> 
</root> 

erzeugt das gewünschte Ergebnis (die gewünschten Elemente sind nummeriert ein d die Zahlen an jedem div[@class='entry] Reset):

<root> 
    <div class="entry"> 
     <div class="headword"> 
       ... 
     </div>1<div class="information-forms"> 
       test infomation block 
     </div> 
     <div class="definition">2<div>text </div>3<div>text </div> 
         ... ... 
      4<div>text </div> 
     </div> 
     <div class="example-sentences"> 
     <ol>5<li>sentence here</li>6<li>sentence here</li> 
       ... ... 
       7<li>sentence here</li> 
     </ol> 
     </div> 
     <div class="synonyms-reference"> 
     <div class="syn-para"> 
        Synonyms: ... ... 
      </div> 
     <div class="ant-para"> 
        Antonyms: ... ... 
      </div> 
     <div class="..."> 
        ... 
      </div> 
     </div> 
    </div> 
    <div class="entry"> 
      ... 
    </div> 
    <div class="entry"> 
     <div class="headword"> 
       ... 
     </div>1<div class="information-forms"> 
       test infomation block 
     </div> 
     <div class="definition">2<div>text </div>3<div>text </div> 
         ... ... 
      4<div>text </div> 
     </div> 
     <div class="example-sentences"> 
     <ol>5<li>sentence here</li>6<li>sentence here</li> 
       ... ... 
       7<li>sentence here</li> 
     </ol> 
     </div> 
     <div class="synonyms-reference"> 
     <div class="syn-para"> 
        Synonyms: ... ... 
      </div> 
     <div class="ant-para"> 
        Antonyms: ... ... 
      </div> 
     <div class="..."> 
        ... 
      </div> 
     </div> 
    </div> 
</root> 

Erläuterung: Angemessene Nutzung des from Attribut xsl:number.

+0

Ich muss den Zähler für jeden 'div [@ class =" entry "]' zurücksetzen. Hilfe! – lex

+0

Noch nicht klar, was Sie als Ergebnis erhalten möchten. Bitte bearbeiten Sie erneut und geben Sie ein minimales (aber vollständiges Beispiel) an. Ich habe das Gefühl, dass Ihr Problem mit einem anderen Attribut von "xsl: number" gelöst werden kann - beschreiben Sie genau, was Sie an welchem ​​Punkt im Code als Ergebnis erhalten müssen. –

+0

Ich habe meine Frage mit mehr Informationen bearbeitet. Ich hoffe, diesmal habe ich erklärt, was ich zu tun versuche. – lex

0

Versuchen Sie es mit

count(preceding::pattern1|preceding::pattern2|preceding::pattern3) 

Um den Zähler wieder an jedem div[@class="entry"] Knoten zu starten, können Sie

count(preceding::pattern1|preceding::pattern2|preceding::pattern3) - count(preceding::div[@class='entry'][1]/preceding::pattern1|preceding::div[@class='entry'][1]/preceding::pattern2|preceding::div[@class='entry'][1]/preceding::pattern3)‌​ 
+0

Dies ist nicht einmal syntaktisch gültig! –

+0

Entschuldigung, jetzt behoben. –