【发布时间】:2012-01-06 05:14:18
【问题描述】:
我有一个巨大的 XML 格式的配置文件。系统不关心标签的顺序,但我们人类关心! (主要用于版本比较。)I already received 下面的 XSLT 运行良好,但我发现它还不够。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates>
<xsl:sort select="(@name, name())[1]"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我想按所有标签的 name 属性值递归排序(这可行!)但由于该属性并不总是存在,它还必须按其他属性排序,任何它可能存在也可能不存在于任何给定元素中。
我对 XSLT 的了解基本上为零,所以我正在试验。我已经破解了上述内容,但它没有按预期工作。这样做的结果似乎与上述相同。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates>
<xsl:sort select="@name"/>
<xsl:sort select="@row" data-type="number"/>
<xsl:sort select="@col" data-type="number"/>
<xsl:sort select="@sequence" data-type="number"/>
<xsl:sort select="@tabindex" data-type="number"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我的数据看起来与此类似,问题是cell 元素根本没有排序(在它们的grid 组内),因为它们没有name 属性。这就是为什么我想扩展排序逻辑以在存在时使用name 属性,否则应该使用tabindex 等附加属性来完成排序。在任何给定的组中,可以假定存在相同的属性。
<sections>
<section name="SomeList">
<caption>
<![CDATA[Candidates]]>
</caption>
...
<parameters>
<parameter name="pageSize">
<![CDATA[50]]>
</parameter>
</parameters>
...
<grid>
<cell row="0" col="7" tabindex="9" colspan="10">
<field name="Entered" />
</cell>
</grid>
</section>
</sections>
更新:
在 Vincent 非常好的帮助下,我创建了一个可以很好地满足我们的目的的排序。 Here it is.
【问题讨论】:
-
相关问题的 Dropbox 链接下可用的示例输入不包含 row、col、sequence 或 tabindex 属性。您可以添加更新的示例吗?
-
@grtjn:当你写评论时,我已经在编辑问题了:-)
-
您使用的是哪种解析器?用 Saxon 9.1b 运行它对我来说效果很好。单元格按预期排序。
-
好问题,+1。您可能有兴趣获得更好、更通用的排序。
-
您可能想要删除您的 Dropbox 链接(404 错误)