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

时间:2012-08-21 13:55:56

标签: xml xslt xslt-1.0 xslt-2.0

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

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

有些人可能会注意到元素的顺序不一样。

有没有人知道übersimplexslt只保留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>

在其元素中具有相同值的文件但是具有某种顺序(在这种情况下按元素名称排序)。

提前致谢!

2 个答案:

答案 0 :(得分:3)

当你告诉它按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,但如果你愿意,实现它们不应该是一个问题。

答案 1 :(得分:2)

这个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>

祝你好运, 彼得