在XSLT中排序不起作用

时间:2015-04-11 07:35:35

标签: xml sorting xslt xslt-2.0

我希望根据帐户中的元素余额对原始XML中的帐户进行排序。我写的代码不起作用,无法弄清楚原因。我认为这是正确的。你能帮我解决我可能出错的地方吗?

这是我原始XML文件的一部分。

<account actype="Current" acid="ac_10100001234" branch-id="br_101" cid="c_100101">
    <open-date>25/5/2013</open-date>
    <close-date>31/03/2015</close-date>
    <balance>5000</balance>
</account>
<account actype="Saving" acid="ac_10100002123" branch-id="br_101" cid="c_100101">
    <open-date>12/5/2012</open-date>
    <close-date>12/11/2014</close-date>
    <balance>8000</balance>
</account>
<account actype="Recurring" acid="ac_12051001" branch-id="br_1205" cid="c_100102">
    <open-date>22/5/2014</open-date>
    <close-date>21/5/2019</close-date>
    <balance>4200</balance>
</account>
<account actype="Fixed" acid="ac_1012052113" branch-id="br_101" cid="c_100102">
    <open-date>20/10/2009</open-date>
    <close-date>19/10/2014</close-date>
    <balance>100000</balance>
</account>
<account actype="Current" acid="ac_100100001234" branch-id="br_1100" cid="c_1001100">
    <open-date>15/5/2010</open-date>
    <close-date>12/4/2014</close-date>
    <balance>300</balance>
</account>

这显示了我如何在帐户上调用我的模板。

<xsl:stylesheet 
  version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="xs"
>
  <xsl:output method="xml" indent="yes" />
  <xsl:template match="/Bank">
    <root>
      <name>
        <xsl:value-of select="name" />
      </name>
      <xsl:apply-templates select="branch" />
      <xsl:apply-templates select="employee" />
      <xsl:apply-templates select="customer" />
      <xsl:apply-templates select="account" />
      <xsl:apply-templates select="transaction" />
    </root>
  </xsl:template>
  <xsl:template match="account">
    <xsl:for-each select=".">
      <xsl:sort select="balance" />
      <Account>
        <AccountNumber>
          <xsl:value-of select="@acid" />
        </AccountNumber>
        <Customerid>
          <xsl:value-of select="@cid" />
        </Customerid>
        <balance>
          <xsl:value-of select="balance" />
        </balance>
      </Account>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:2)

要实现排序输出,您需要按照特定顺序应用模板。模板无法自行排序。

<xsl:stylesheet 
  version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="xs"
>
  <xsl:output method="xml" indent="yes" />

  <xsl:template match="/Bank">
    <root>
      <xsl:copy-of select="name" />
      <xsl:apply-templates select="branch" />
      <xsl:apply-templates select="employee" />
      <xsl:apply-templates select="customer" />
      <!-- here! -->
      <xsl:apply-templates select="account">
        <xsl:sort select="balance" data-type="number" />
      </xsl:apply-templates>
      <xsl:apply-templates select="transaction" />
    </root>
  </xsl:template>

  <xsl:template match="account">
    <Account>
      <AccountNumber>
        <xsl:value-of select="@acid" />
      </AccountNumber>
      <Customerid>
        <xsl:value-of select="@cid" />
      </Customerid>
      <xsl:copy-of select="balance" />
    </Account>
  </xsl:template>
</xsl:stylesheet>

请注意

  • data-type。默认为“string”,不会正确排序数字。
  • <xsl:copy-of>
  • 您似乎没有使用xs命名空间,您可以删除声明。