2016-11-07 5 views
0

ich eine XML-Datei wie diese haben,XSLT - dynamisch hinzufügen Attribut zu ändern, basierend auf Position

<doc> 
    <lo> 
     <li>text1</li> 
     <li>text2</li> 
     <li>text3</li> 
     <li>text4</li> 
     <li>text5</li> 
     <li>text6</li> 
     <li>text7</li> 
     <li>text8</li> 
     <li>text9</li> 
     <li>text10</li> 
     <li>text11</li> 
     <li>text12</li> 
     <li>text13</li> 
     <li>text14</li> 
     <li>text15</li> 
     <li>text16</li> 
    </lo> 
</doc> 

Ich muss dynamisch padding Attribut auf die Listenelemente hinzuzufügen. Reihenfolge der Hinzufügung padding wird von 25 jeder Multiplizierer 5 sollte Padding-Wert durch Schaden Sequenz hinzufügen.

zB:

5th list item: padding=25 
10th list item: padding=20 
15th list item: padding=15 
10th list item: padding=10 

und für jede erste vorhergehenden Geschwister und folgende Geschwister 5. Multiplizierer shold den Füllwert -3 vom Mittel 5. Multiplizierer erhalten.

zB:

4th list item: padding=22 
5th list item: padding=25 
6th list item: padding=22 
9th list item: padding=17 
10th list item: padding=20 
11th list item: padding=17 

So erwartete Ausgabe probieren sollte wie folgt aussehen,

<doc> 
    <lo> 
     <li>text1</li> 
     <li>text2</li> 
     <li>text3</li> 
     <li padding ="22">text4</li> 
     <li padding ="25">text5</li> 
     <li padding ="22">text6</li> 
     <li>text7</li> 
     <li>text8</li> 
     <li padding ="17">text9</li> 
     <li padding ="20">text10</li> 
     <li padding ="17">text11</li> 
     <li>text12</li> 
     <li>text13</li> 
     <li padding ="12">text14</li> 
     <li padding ="15">text15</li> 
     <li padding ="12">text16</li> 
    </lo> 
</doc> 

ich folgende Xslt geschrieben haben, für diese Aufgabe zu tun,

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

    <xsl:template match="li"> 
     <li> 
      <xsl:choose> 
       <xsl:when test="(abc:get-list-position(.) mod 5) =0"> 
        <xsl:attribute name="padding" select="25"/> 
       </xsl:when> 
      </xsl:choose> 
      <xsl:apply-templates/> 
     </li> 
    </xsl:template> 

    <xsl:function name="abc:get-list-position"> 
     <xsl:param name="node"/> 

     <xsl:sequence select="count($node/preceding-sibling::li) + 1"/> 
    </xsl:function> 

Aber da XSLT tut Ich habe keine inkrementellen Variablen und Vorschübe, ich bemühe mich, meine Logik weiter zu erweitern. Kann mir jemand vorschlagen, wie ich diese Aufgabe mit XSLT erreichen kann.

Antwort

2

XSLT verfügt bereits über eine position()-Funktion, es ist nicht notwendig, sie neu zu erfinden.

AFAICT, möchten Sie tun:

XSLT 2,0

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

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

<xsl:template match="li[position() gt 3 and position() mod 5 = (0, 1, 4)]"> 
    <xsl:variable name="x" select="6 - (position() + 1) idiv 5" /> 
    <xsl:copy> 
     <xsl:attribute name="padding" select="5 * $x - 3 * number(position() mod 5 != 0)"/> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
Verwandte Themen