2010-09-01 9 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> 

JavascriptXml avec javascript Traversant

il devrait prendre les liens de liens-> osname et correspondre avec le nom

propriétaires-> os => et le nom d'os est supposé être une seule fois , il ne devrait pas répéter plus tard.

Merci à l'avance

+0

Veuillez fournir la sortie XML souhaitée à partir de la transformation XSLT. Laisser les gens deviner n'est pas susceptible de fournir la solution dont vous avez besoin. –

Répondre

1

En supposant que ce qui précède est un magasin dans la variable 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); 
} 

Et puis d'accéder au XML que vous avez fourni en javascript:

// 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 

Il y a beaucoup de code sur les filets expliquant tout cela (voir aussi: getNamedItem, getElementsByTagName, nodeValue ... et beaucoup plus)

à traverser:

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

Cette feuille de style:

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

Avec l'entrée correcte:

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

sortie ce que je pense est ce que vous voulez:

<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

Une manière plus pratique de travailler avec xml, est d'utiliser jQuery.

Il suffit de récupérer les données:

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

et faire tout ce que vous voulez:

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

Si vous connaissez jQuery, il devrait être une tâche facile pour vous.