1

我正在尝试转换此 XML 树

<IN1>
    <IN1.1>
        <IN1.1.1>1</IN1.1.1>
    </IN1.1>
    <IN1.17>
        <IN1.17.1>1</IN1.17.1>
    </IN1.17>
    <IN1.47>
        <IN1.47.1>C</IN1.47.1>
    </IN1.47>
    <IN1.3>
        <IN1.3.1>paycode</IN1.3.1>
    </IN1.3>
</IN1>

进入这个

<IN1>
    <IN1.1>
        <IN1.1.1>1</IN1.1.1>
    </IN1.1>
    <IN1.3>
        <IN1.3.1>paycode</IN1.3.1>
    </IN1.3>
    <IN1.17>
        <IN1.17.1>1</IN1.17.1>
    </IN1.17>
    <IN1.47>
        <IN1.47.1>C</IN1.47.1>
    </IN1.47>
</IN1>

我目前的代码是

for each (field in msg['IN1'].children()) 
{
    fields.push(field.toString());
}
fields.sort();

这对最后两个元素进行排序,然后重新排列前两个元素。解决这个问题的好方法是什么?

4

3 回答 3

1

通过使用 jQuery TinySort插件,您可能会找到一些运气。您可以根据数字/字母参数对 DOM 元素进行排序。

于 2012-10-16T19:55:19.470 回答
0

1) 编写递归算法,对树中的每个节点进行排序。

对于每个孩子:

2) 将元素下的所有子元素聚集到一个 JavaScript 数组中。
3) 根据自定义标准对数组进行排序。
4) 迭代数组,按排序顺序将子代添加到父代。
注意:将子元素重新添加到 DOM 会自动将其从之前的位置移除。

如果您需要有关这些部分的其他帮助,请随时澄清。

于 2012-10-16T22:15:34.923 回答
0

创建 XSLT 是为了将 XML 从一种形式转换为另一种形式(jsFiddle):

var xml = "<IN1><IN1.1><IN1.1.1>1</IN1.1.1></IN1.1><IN1.17><IN1.17.1>1</IN1.17.1></IN1.17><IN1.47><IN1.47.1>C</IN1.47.1></IN1.47><IN1.3><IN1.3.1>paycode</IN1.3.1></IN1.3></IN1>";
var xsl = "<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"><xsl:template match=\"IN1\"><IN1><xsl:apply-templates select=\"*\"><xsl:sort select=\"substring-after(name(), 'IN1.')\" data-type=\"number\"/></xsl:apply-templates></IN1></xsl:template><xsl:template match=\"*\"><xsl:copy-of select=\".\"/></xsl:template></xsl:stylesheet>";
var parser = new DOMParser();
var domToBeTransformed = parser.parseFromString(xml, "text/xml");
var xslt = parser.parseFromString(xsl, "text/xml");
var processor = new XSLTProcessor();
processor.importStylesheet(xslt);
var newDocument = processor.transformToDocument(domToBeTransformed);
var serializer = new XMLSerializer();
var newDocumentXml = serializer.serializeToString(newDocument);
alert(newDocumentXml);

以上代码适用于 Chrome 和 Firefox;小提琴有 IE 的实现。IE 的诀窍在于它对 Active X 的依赖。它都是随 IE 一起安装的,不过,实际上,没有使用“外部”库。

祝你好运。

于 2012-10-16T22:07:35.227 回答