如何使用JavaScript或XSLT转换XML(XML文档)

时间:2017-01-31 10:38:06

标签: javascript xml xslt

我的源XML是这样的:

<root>
    <element>
        <dog>OK</dog>
        <cat>KO</cat>
        <sheep/>
        <snake>OK</snake>
    </element>
    <element>
        <cat>OK</cat>
        <horse/>
    </element>
    <element>
        <sheep>KO</sheep>
        <snake>OK</snake>
        <horse>OK</horse>
        <bird>KO</bird>
    </element>
</root>

需要将其转换为以下格式:

<root>
    <list>
        <element>
            <animals>
                <name>dog</name>
                <value>OK</value>
            </animals>
            <animals>
                <name>cat</name>
                <value>KO</value>
            </animals>
            <animals>
                <name>sheep</name>
                <value/>
            </animals>
            <animals>
                <name>snake</name>
                <value>OK</value>
            </animals>
        </element>
        <element>
            <animals>
                <name>cat</name>
                <value>OK</value>
            </animals>
            <animals>
                <name>horse</name>
                <value/>
            </animals>
        </element>
        <element>
            <animals>
                <name>sheep</name>
                <value>KO</value>
            </animals>
            <animals>
                <name>snake</name>
                <value>OK</value>
            </animals>
            <animals>
                <name>horse</name>
                <value>OK</value>
            </animals>
            <animals>
                <name>bird</name>
                <value>KO</value>
            </animals>
        </element>
    </list>
</root>

基本上,我需要在源XML中获取元素名称及其值,并将它们映射到目标XML中的元素。

非常感谢有关如何在JavaScript或XSLT中实现此目的的任何提示。

谢谢。

2 个答案:

答案 0 :(得分:0)

这是一个简单的JavaScript解决方案。

您可以格式化结果here

function createXmlDoc(string) {
var doc;
if (window.DOMParser) {
	parser = new DOMParser();
	doc = parser.parseFromString(string, "application/xml");
}
else // Internet Explorer
{
	doc = new ActiveXObject("Microsoft.XMLDOM");
	doc.async = "false";
	doc.loadXML(string);
}
return doc;
}
 
var parser, xmlDoc;
var text = "<root><element><dog>OK</dog><cat>KO</cat><sheep/><snake>"
 + "OK</snake></element><element><cat>OK</cat><horse/></element><element><"
 + "sheep>KO</sheep><snake>OK</snake><horse>OK</horse><bird>KO</bird></ele"
 + "ment></root>";
 
xmlDoc = createXmlDoc(text);

var oxd = createXmlDoc('<root><list></list></root>');	
var txt;

var elements = xmlDoc.documentElement.childNodes;

elements.forEach(function (el, idx) {
 
var nel = oxd.createElement(el.nodeName);
oxd.documentElement.firstChild.appendChild(nel);

el.childNodes.forEach(function (e, idx) {

	var animals = oxd.createElement("animals");
	var nodeName = oxd.createElement("name");
	var nodeValue = oxd.createElement("value");

	nodeName.appendChild(oxd.createTextNode(e.nodeName));
	var val = oxd.createTextNode(e.childNodes.length > 0 ? e.childNodes[0].nodeValue : "");
	nodeValue.appendChild(val);	
	 
	animals.appendChild(nodeName);
	animals.appendChild(nodeValue);

	nel.appendChild(animals);				
});			
});

txt = (new XMLSerializer()).serializeToString(oxd);
console.log(txt);	

<强>结果:

<root>
   <list>
      <element>
         <animals>
            <name>dog</name>
            <value>OK</value>
         </animals>
         <animals>
            <name>cat</name>
            <value>KO</value>
         </animals>
         <animals>
            <name>sheep</name>
            <value />
         </animals>
         <animals>
            <name>snake</name>
            <value>OK</value>
         </animals>
      </element>
      <element>
         <animals>
            <name>cat</name>
            <value>OK</value>
         </animals>
         <animals>
            <name>horse</name>
            <value />
         </animals>
      </element>
      <element>
         <animals>
            <name>sheep</name>
            <value>KO</value>
         </animals>
         <animals>
            <name>snake</name>
            <value>OK</value>
         </animals>
         <animals>
            <name>horse</name>
            <value>OK</value>
         </animals>
         <animals>
            <name>bird</name>
            <value>KO</value>
         </animals>
      </element>
   </list>
</root>

答案 1 :(得分:0)

这是我使用XSLT获得的:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:template match="/">
        <root>
            <list>
                <xsl:apply-templates/>
            </list>
        </root>
    </xsl:template>
    <xsl:template match="element">
        <element>
            <xsl:for-each select="*">
                <animals>
                    <name>
                        <xsl:value-of select="local-name()"/>
                    </name>
                    <value>
                        <xsl:value-of select="text()"/>
                    </value>
                </animals>
            </xsl:for-each>
        </element>
    </xsl:template>
</xsl:stylesheet>