2017-01-31 34 views
0

我的源XML是這樣的:如何變換使用JavaScript或XSLT XML(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

這裏有一個簡單的JavaScript解決方案。

可以格式化結果here

function createXmlDoc(string) { 
 
var doc; 
 
if (window.DOMParser) { 
 
\t parser = new DOMParser(); 
 
\t doc = parser.parseFromString(string, "application/xml"); 
 
} 
 
else // Internet Explorer 
 
{ 
 
\t doc = new ActiveXObject("Microsoft.XMLDOM"); 
 
\t doc.async = "false"; 
 
\t 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>'); \t 
 
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) { 
 

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

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

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

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

結果:

<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> 
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> 
+0

您可以將整個解決方案作爲代碼片段使用,那將很不錯。謝謝。 – Legends