我的源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中实现此目的的任何提示。
谢谢。
答案 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>