对 XML 文件中的元素进行排序



我有一个看起来像这样的文件:

<xml>
 <person>
  <name>John</name>
  <age>33</age>
  <car>Yugo</car>
 </person>
 <person>
  <car>Tesla</car>
  <age>44</age>
  <name>Peter</name>
 </person>
<xml>

正如有些人可能会注意到的那样,其中的元素顺序不同。

有没有人知道一个 übersimple xslt 它只保留 xml 内容但格式化文件?

这将是所需的输出:

<xml>
 <person>
  <age>33</age>
  <car>Yugo</car>
  <name>John</name>
 </person>
 <person>
  <age>44</age>
  <car>Tesla</car>
  <name>Peter</name>
 </person>
<xml>

在其元素中具有相同值但具有某种顺序的文件(在本例中按元素名称排序(。

当你告诉它按函数的值排序时,xsl:sort应该可以local-name()技巧。如果要考虑命名空间前缀,请将其替换为name()函数。

以下样式表复制几乎任何文档中的所有元素,并按字母顺序对其内容进行排序。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
    <xsl:template match="*">
        <xsl:copy>
            <xsl:apply-templates>
                <xsl:sort select="local-name()"></xsl:sort>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

它不会考虑属性、注释或 CDATA,但如果需要,实现这些应该不是问题。

这个 XSLT:

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

应用于此 XML:

<?xml version="1.0" encoding="UTF-8"?>
<xml>
<person>
    <name>John</name>
    <age>33</age>
    <car>Yugo</car>
</person>
<person>
    <car>Tesla</car>
    <age>44</age>
    <name>Peter</name>
</person>
</xml>

给出以下输出:

<?xml version="1.0" encoding="UTF-8"?>
<xml>
<person>
    <age>33</age>
    <car>Yugo</car>
    <name>John</name>
</person>
<person>
    <age>44</age>
    <car>Tesla</car>
    <name>Peter</name>
</person>
</xml>

相关内容

  • 没有找到相关文章

最新更新