xslt中的for-each排序

  众所周知,大家能够动用xslt对xml数据开展格式化输出,xslt中有一种for-each标记可以完成对xml中再一次标记的轮回遍历,如若您对xslt还不太了然,可以去W3school网站上通晓下。使用for-each标记可以非凡方便地落到实处节点的遍历,而且在遍历的还要还足以对节点举办排序。

  例如大家有如此一个xml文本:

<?xml version=”1.0″ encoding=”utf-8″?>
<Users>
  <User>
    <Name>Jaxu</Name>
    <ID>1</ID>
    <Professional>.NET,PHP Design</Professional>
  </User>
  <User>
    <Name>Bruce</Name>
    <ID>2</ID>
    <Professional>Project Manager</Professional>
  </User>
  <User>
    <Name>Tony</Name>
    <ID>3</ID>
    <Professional>Developer</Professional>
  </User>
  <User>
    <Name>John</Name>
    <ID>4</ID>
    <Professional>Dev lead</Professional>
  </User>
  <User>
    <Name>Eric</Name>
    <ID>5</ID>
    <Professional>Tester</Professional>
  </User>
  <User>
    <Name>Owen</Name>
    <ID>6</ID>
    <Professional>Designer</Professional>
  </User>
  <User>
    <Name>Bruce</Name>
    <ID>7</ID>
    <Professional>Project Manager</Professional>
  </User>
</Users>

   根据Name升序,ID降序进行排序输出,上边是应和的xslt代码:

<?xml version=”1.0″ encoding=”utf-8″?>
<xsl:stylesheet version=”1.0″ xmlns:xsl=”http://www.w3.org/1999/XSL/Transform
    xmlns:msxsl=”urn:schemas-microsoft-com:xslt” exclude-result-prefixes=”msxsl”
>
  <xsl:output method=”html” indent=”yes”/>

  <xsl:template match=”*”>
    <table border=”1″ cellpadding=”2″ cellspacing=”4″ width=”100%”>
PHP,      <xsl:for-each select=”//User”>
        <xsl:sort select=”Name” order=”ascending”/>
        <xsl:sort select=”ID” order=”descending”/>
        <tr>
          <td>
            <div>
              ID: <xsl:value-of select=”ID”/>
            </div>
            <div>
              Name: <xsl:value-of select=”Name”/>
            </div>
            <div>
              Professional: <xsl:value-of select=”Professional”/>
            </div>
          </td>
        </tr>
      </xsl:for-each>
    </table>

  </xsl:template>
</xsl:stylesheet>

   上边是出口的结果:  

ID: 7
Name: Bruce
Professional: Project Manager
ID: 2
Name: Bruce
Professional: Project Manager
ID: 5
Name: Eric
Professional: Tester
ID: 1
Name: Jaxu
Professional: .NET,PHP Design
ID: 4
Name: John
Professional: Dev lead
ID: 6
Name: Owen
Professional: Designer
ID: 3
Name: Tony
Professional: Developer

  xsl:sort语句能够对此用xsl:for-each或xsl:apply-templates匹配的节点举行排序,xsl:sort语句必须写在它所拔取的标志的第一行(从前不允许有其他任何标记),如:

按大小写排序
  <xsl:sort case-order=”upper-first” select=”@id”/>
以id为重点字按大写优先排序
  <xsl:sort case-order=”lower-first” select=”@id”/>
以id为首要字按小写优先排序
按字母逐一排序
  <xsl:sort order=”ascending” select=”@id “/>
以id为重点字按字母升序排序
  <xsl:sort order=”descending” select=”@id “/>
以id为主要字按字母降序排序
按数据类型排序
  <xsl:sort data-type=”text” select=”@id”/>
以id为根本字按文件类型排序,如对于一组id数据101,2,44,305
来说,排序结果是101,2,305,44
  <xsl:sort data-type=”number” select=”@id”/>
以id为机要字按数据类型排序,上面一组数据的排序结果是2,44,101,305

  此外,我们还足以在for-each语句中利用position()函数完成节点的岗位排序,如<xsl:sort
select=”position()”
order=”descending”/>。那里还有一种方法可以兑现节点的地方倒序排序,没有动用xsl:sort语句,完全按照position()函数的义务来定位节点。

<?xml version=”1.0″ encoding=”utf-8″?>
<xsl:stylesheet version=”1.0″ xmlns:xsl=”http://www.w3.org/1999/XSL/Transform
    xmlns:msxsl=”urn:schemas-microsoft-com:xslt” exclude-result-prefixes=”msxsl”
>
  <xsl:output method=”html” indent=”yes”/>

  <xsl:template match=”*”>
    <table border=”1″ cellpadding=”2″ cellspacing=”4″ width=”100%”>
      <xsl:variable name=”countUser” select=”count(//User)” />
      <xsl:for-each select=”//User”>
        <xsl:variable name=”pos” select=”position()”/>
        <tr>
          <td>
            <div>
              ID: <xsl:value-of select=”../User[position() = $countUser – $pos + 1]/ID”/>
            </div>
            <div>
              Name: <xsl:value-of select=”../User[position() = $countUser – $pos + 1]/Name”/>
            </div>
            <div>
              Professional: <xsl:value-of select=”../User[position() = $countUser – $pos + 1]/Professional”/>
            </div>
          </td>
        </tr>
      </xsl:for-each>
    </table>
  </xsl:template>
</xsl:stylesheet>

 

  xslt在编辑方面还有不少的技能,需求我们在行使的历程中连连去发现,而且前卫的xslt
2.0业内中还增添了成百上千新的性质和标志,今后大家就可以使用xslt编写出越多逻辑复杂的代码了。

相关文章