用javascript进行Xml遍历

用javascript进行Xml遍历,javascript,xml,xslt,Javascript,Xml,Xslt,Javascript 它应该从links->osname获取链接,并将其与所有者->os=>name匹配 操作系统名称应该是唯一的,以后不应该重复 提前感谢假设上述内容存储在变量txt中: <links> <osname name="windows xp" links="xyz" /> <osname name="windows 2k" links="xyz" /> </links> <owners name="microso

Javascript

它应该从links->osname获取链接,并将其与所有者->os=>name匹配

操作系统名称应该是唯一的,以后不应该重复


提前感谢

假设上述内容存储在变量txt中:

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

if (window.DOMParser) {
  parser=new DOMParser();
  xmlDoc=parser.parseFromString(txt,"text/xml");
} else {
  xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  xmlDoc.async="false";
  xmlDoc.loadXML(txt); 
}
网络上有很多代码解释了这一切(另请参见:
getNamedItem
getElementsByTagName
nodeValue
…以及更多)

穿越:

// 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
对于(i=0;i此样式表:

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

如果输入正确:

<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>
$.ajax({ url: '/Document.xml', success: ProcessData, contentType: 'text/xml' });

使用xml更方便的方法是使用jQuery

只需检索数据:

<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>
做你想做的事:

<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>
$.ajax({ url: '/Document.xml', success: ProcessData, contentType: 'text/xml' });

如果您了解jQuery,这对您来说应该很容易。

请从XSLT转换中提供所需的XML输出。让人们猜测不太可能提供您需要的解决方案。