天天看點

[XSLT技巧] 實作自動編号

 下面是一個實作自動編号的例子:

test.xml:

<?xml version="1.0" encoding="gb2312"?>

<?xml-stylesheet type="text/xsl" href="test.xsl" target="_blank" rel="external nofollow" ?>

<root>

 <itemA>a</itemA>

 <itemB>b</itemB>

 <itemB>b</itemB>

 <itemA>a</itemA>

 <itemA>a</itemA>

 <itemA>a</itemA>

 <itemA>a</itemA>

 <itemB>b</itemB>

 <itemB>b</itemB>

 <itemB>b</itemB>

 <itemA>a</itemA>

 <itemB>b</itemB>

 <itemA>a</itemA>

 <itemB>b</itemB>

</root>

test.xsl:

<?xml version="1.0" encoding="GB2312"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:template match="root">

  <xsl:apply-templates/>

 </xsl:template>

 <xsl:template match="itemA">

  <span style="color: blue">

   <xsl:value-of select="name()"/>'s index =

   <xsl:call-template name="getIndex">

    <xsl:with-param name="elemName" select="name()"/>

   </xsl:call-template>

  </span>

  <br />

 </xsl:template>

 <xsl:template match="itemB">

  <span style="color: red">

   <xsl:value-of select="name()"/>'s index =

   <xsl:call-template name="getIndex">

    <xsl:with-param name="elemName" select="name()"/>

   </xsl:call-template>

  </span>

  <br />

 </xsl:template>

 <xsl:template name="getIndex"><!-- 獲得目前層下,指定元素的序号 -->

  <xsl:param name="elemName"/>

  <xsl:param name="initNo">1</xsl:param> <!-- 設定初始值,預設為1。 -->

  <xsl:value-of select="count(preceding-sibling::*[name()=$elemName])+number($initNo)"/>

 </xsl:template>

</xsl:stylesheet>

繼續閱讀