我有一个listview,它将xmldatasource作为其数据源。 xmldatasource是动态创建和分配的。在使用
将数据绑定到列表视图之前使用xpath listview.datasource = myxmlsource
listview.DataBind()
仅使用xpath="root/node"
选择节点元素.Hence我认为应用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"/>
请注意,它没有root。我正在尝试对这个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>
答案 0 :(得分: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>