2016-11-07 75 views
0
位置

我有這樣一個XML文件動態變化的屬性,XSLT - 添加基於

<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> 

我需要padding屬性動態地添加到列表中的項目。添加padding的序列從25開始每個乘法器5應該通過損害序列添加填充值。

例如:

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

和第五乘法器的每一個第一前置兄弟和以下同級shold獲得填補值-3從中間第五乘法器。

如:

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 

所以品嚐預期的輸出應該是這樣的,

<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> 

我寫了下面的XSLT爲做這個任務,

<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> 

但由於XSLT那樣沒有增量變量和高級循環,我正努力進一步擴展我的邏輯。任何人都可以建議我如何使用XSLT實現此任務。

回答

2

XSLT已具有position()函數,您不需要重新創建它。

AFAICT,你想做的事:

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>