我有以下XML:
<Users>
<User Id="1">
<Name>abc</Name>
<LastName>d</LastName>
</User>
<User Id="2">
<Name></Name>
<LastName>ab</LastName>
</User>
<User Id="3">
<Name>a</Name>
<LastName>efg</LastName>
</User>
</Users>
Run Code Online (Sandbox Code Playgroud)
现在我使用以下模板对用户进行排序
<xsl:template match="Users">
<Users>
<xsl:for-each select="User">
<xsl:sort select="Name"/>
<xsl:sort select="LastName"/>
<User>
<xsl:attribute name="Id">
<xsl:value-of select="attribute::Id"/>
</xsl:attribute>
<Name>
<xsl:value-of select="Name"/>
</Name>
<LastName>
<xsl:value-of select="LastName"/>
</LastName>
</User>
</xsl:for-each>
</Users>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
但我需要排序,满足以下条件:按名称排序.如果Name为空或null,我需要按LastName排序.所以在生成的XML中我需要以下订购:User3,User2,User1.
任何帮助表示赞赏.
PS:我使用ASP.NET 3.5
我将首先使用恒等变换,然后将排序应用于元素的并集(不包括那些Name
为空的元素)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Users">
<xsl:copy>
<xsl:apply-templates select="User">
<xsl:sort select="Name[.!='']|LastName"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
当应用于问题中显示的输入时,我们得到:
<Users>
<User Id="3">
<Name>a</Name>
<LastName>efg</LastName>
</User>
<User Id="2">
<Name/>
<LastName>ab</LastName>
</User>
<User Id="1">
<Name>abc</Name>
<LastName>d</LastName>
</User>
</Users>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
662 次 |
最近记录: |