0

我有一个列表视图,它获取一个 xmldatasource 作为其数据源。xmldatasource 是动态创建和分配的。在将数据绑定到列表视图之前使用 xpath

 listview.datasource = myxmlsource
listview.DataBind()

仅使用 . 选择节点元素xpath="root/node"。因此我认为应用 xpath 后的 xml 结构如下所示:

<node name="Albert" age="32" desc="some random description" region="north"/>
<node name="Randy" age="32" desc="some random description" region="south"/>
<node name="Zebra" age="32" desc="some random description"region="east"/>
<node name="Bob" age="32" desc="some random description"region="south"/>
<node name="Carl" age="32" desc="some random description"region="north"/>
<node name="Denver" age="32" desc="some random description"region="east"/>

请注意,它没有根。我正在尝试对这个 XSLT 进行排序。

这里的目的是按区域对 xml 进行分组,然后按名称对 xml 进行排序。

我是 XSLT 的新手,它似乎是一头野兽。

到目前为止,我能想出的 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 my" xmlns:my="http://tempuri.org"
>
  <xsl:output method="xml" indent="yes"/>

    <xsl:template name="@*|node()">

      <xsl:copy>
        <xsl:apply-templates select="@*|node() >
          <xsl:sort select="@region" order="ascending"/>
          <xsl:sort select="@name"/>
        </xsl:apply-templates>
      </xsl:copy>    
    </xsl:template>    

</xsl:stylesheet>

按区域分组并按名称排序后的预期输出为:

<node name="Denver" age="32" desc="some random description"region="east"/>
<node name="Zebra" age="32" desc="some random description"region="east"/>
<node name="Albert" age="32" desc="some random description" region="north"/>
<node name="Carl" age="32" desc="some random description"region="north"/>
<node name="Bob" age="32" desc="some random description"region="south"/>
<node name="Randy" age="32" desc="some random description" region="south"/>

更新:

我忘了提一下:按地区分组的顺序不一定是升序或降序,而是可以基于任何自定义条件,例如北第一、东第二和南第三。如何实现自定义排序?

我尝试了以下和更多类似的东西,我得到了

该文档已经有一个“DocumentElement”节点。

<?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="xml" indent="yes"/>

        <xsl:template match="@*|node()">
          <xsl:copy>
            <xsl:apply-templates select="node[@region='north']" >
              <xsl:sort select="@name"/>
            </xsl:apply-templates>
          </xsl:copy>    
           <xsl:copy>
            <xsl:apply-templates select="node[@region='east']" >
              <xsl:sort select="@name"/>
            </xsl:apply-templates>
          </xsl:copy>    
          <xsl:copy>
            <xsl:apply-templates select="node[@region='south']" >
              <xsl:sort select="@name"/>
            </xsl:apply-templates>
          </xsl:copy>  
        </xsl:template>    

    </xsl:stylesheet>
4

1 回答 1

0

您的 XSLT 几乎是正确的 - 模板应该有一个match="..."而不是一个name="..."属性 - 这是工作版本:

<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 my" xmlns:my="http://tempuri.org"
>
  <xsl:output method="xml" indent="yes"/>

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

</xsl:stylesheet>
于 2012-10-10T22:43:41.683 回答