使用XSL排序属性(Using XSL to sort attributes)

2019-07-18 03:52发布

我试图通过域名(不值)排序每个元素的属性,以规范化的一些XML数据的代表性。 这样做是为了保持文本的差异最小当属性被添加或移除,并防止不同的编辑器从引入等价变体。 这些XML文件是源代码控制之下,开发商是想diff的变化,而不诉诸专门的XML工具。

我很惊讶地发现没有一个XSL例如如何这一点。 基本上我只想身份与排序的属性变换。 我想出了以下与好像是我所有测试用例的工作:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
  <xsl:template match="*|/|text()|comment()|processing-instruction()">
    <xsl:copy>
    <xsl:for-each select="@*">
        <xsl:sort select="name(.)"/>
        <xsl:copy/>
      </xsl:for-each>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

作为一个总XSL的n00b我将不胜感激风格或效率的任何意见。 我想,因为它似乎至少不是一个常见的例子可能是有益的张贴在这里。

Answer 1:

用XSLT是一个功能性的语言做了,每个往往可能是我们人类,但最简单的路径不是最有效的XSLT处理器,因为它们不能充分优化呼叫。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
  <xsl:template match="*">
    <xsl:copy>
      <xsl:apply-templates select="@*">
        <xsl:sort select="name()"/>
      </xsl:apply-templates>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="@*|comment()|processing-instruction()">
    <xsl:copy />     
  </xsl:template>
</xsl:stylesheet>

这完全是微不足道的在这方面,虽然并作为“XSL的n00b”我想你解决了这个问题确实非常好。



Answer 2:

干得好解决问题。 当我想你知道订单或属性是不重要的XML解析器所以这项工作的主要好处是对人类 - 在不可预知的方式输入或输出机器将重新排序。

规范化的XML是不平凡的,你会被建议使用提供任何合理的XML工具包canonicalizer而不是写你自己的。



文章来源: Using XSL to sort attributes