我有一个看起来像这样的文件:
<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>
在其元素中具有相同值的文件但是具有某种顺序(在这种情况下按元素名称排序)。
提前致谢!
答案 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>
祝你好运, 彼得