我有一个看起来像这样的文件:
<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>