2

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

<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 内容但格式化 in-file 的 übersimple xslt?

这将是想要的输出:

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

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

4

2 回答 2

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,但如果您愿意,实现这些应该不是问题。

于 2012-08-21T14:13:00.013 回答
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>
于 2012-08-21T14:25:37.113 回答