2010-09-01 155 views
1
<links> 
    <osname name="windows xp" links="xyz" /> 
    <osname name="windows 2k" links="xyz" /> 
</links> 
<owners name="microsoft"> 
    <os name="windows xp" /> 
    <os name="windows 2k" /> 
    <os name="windows 2003" /> 
    <os name="windows 7" /> 
</owners> 
<owners name="microsoft"> 
    <os name="windows xp" /> 
    <os name="windows 95" /> 
    <os name="windows 98" /> 
    <os name="windows vista" /> 
</owners> 

的Javascript的Xml使用JavaScript遍歷

它應該從鏈接 - > OSNAME的聯繫,並與owners-> OS =>名稱

和OS名進行匹配是假設一次只,以後不應該重複。

在此先感謝

+0

請提供XSLT轉換所需的XML輸出。 讓人們猜測不太可能提供您需要的解決方案。 – 2010-09-02 02:50:17

回答

1

假設上面是店可變TXT:

if (window.DOMParser) { 
    parser=new DOMParser(); 
    xmlDoc=parser.parseFromString(txt,"text/xml"); 
} else { 
    xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); 
    xmlDoc.async="false"; 
    xmlDoc.loadXML(txt); 
} 

然後訪問你的JavaScript提供的XML:

// links.osname[0].attribute(name) 
xmlDoc.childNodes[0].childNodes[0].getAttribute('name'); 
// outputs: windows xp 

// owners.os[2].attribute(name) 
xmlDoc.childNodes[1].childNodes[2].getAttribute('name'); 
// outputs: windows 2003 

有相當多的密碼解釋所有這些網絡(另見:getNamedItemgetElementsByTagName,nodeValue ...以及更多)

要遍歷:

for(i=0;i<xmlDoc.childeNodes[1].childNodes.length;i++) { 
    //Access each node in the set: 
    xmlDoc.childNodes[1].childNodes[i] 
} 
1

這個樣式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes"/> 
    <xsl:key name="kOwnersByName" match="owners" use="@name"/> 
    <xsl:key name="kOsByOwnerAndName" match="os" 
      use="concat(../@name,'+++',@name)"/> 
    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="owners"/> 
    <xsl:template match="owners[count(.|key('kOwnersByName',@name)[1])=1]"> 
     <xsl:variable name="vOwner" select="@name"/> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:for-each select="../links/osname/@name"> 
       <xsl:apply-templates 
       select="key('kOsByOwnerAndName',concat($vOwner,'+++',.))[1]"/> 
      </xsl:for-each> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

通過適當的輸入:

<root> 
    <links> 
     <osname name="windows xp" links="xyz" /> 
     <osname name="windows 2k" links="xyz" /> 
    </links> 
    <owners name="microsoft"> 
     <os name="windows xp" /> 
     <os name="windows 2k" /> 
     <os name="windows 2003" /> 
     <os name="windows 7" /> 
    </owners> 
    <owners name="microsoft"> 
     <os name="windows xp" /> 
     <os name="windows 95" /> 
     <os name="windows 98" /> 
     <os name="windows vista" /> 
    </owners> 
</root> 

輸出什麼,我認爲是你想要什麼:

<root> 
    <links> 
     <osname name="windows xp" links="xyz"></osname> 
     <osname name="windows 2k" links="xyz"></osname> 
    </links> 
    <owners name="microsoft"> 
     <os name="windows xp"></os> 
     <os name="windows 2k"></os> 
    </owners> 
</root> 
1

使用xml更方便的工作方式是使用jQuery

只是檢索數據:

$.ajax({ url: '/Document.xml', success: ProcessData, contentType: 'text/xml' }); 

,做任何你想要的:

function ProcessData(data) { 
    var xml = $(data); 
    xml.find("links osname[name]").each(function() { 
     var value = $(this).attr("links")); 
     // etc. 
    }); 
} 

如果你知道jQuery的,它應該是爲你輕鬆的任務。