显示不同属性值及其出现次数的表格?

时间:2016-02-17 12:15:46

标签: html xml xslt

我有一个XML文件,其中有几个节点具有相同的标识号id1id2id3。我想计算具有相同ID的节点,其中包含特定属性attr = "ATR"

<ROOT>
<Node id="id1" att="Non" >
</Node >   
<Node id="id1" att="-" >
</Node >
<Node id="id1" att="ATR" >
</Node >   
<Node id="id1" att="ATR" >
</Node >   
<Node id="id2" att="Non" >
</Node >   
<Node id="id2" att="Non" >
</Node>   
<Node id="id2" att="ATR" >
</Node >
</ROOT>

结果应显示在表格中

id1 2

id2 1

2 个答案:

答案 0 :(得分:0)

这是一个如何阅读XML内容并在html页面中显示它的示例:

<body>
<table>
<tr>
    <td>id1</td>
    <td id="id1"></td>
</tr>
<tr>
    <td>id2</td>
    <td id="id2"></td>
</tr>
</table>

</body>

ajax请求:

$.ajax({
type: "GET",
url: "main.xml",
dataType: "xml",
success: function (xml) {
    var xmlDoc = $.parseXML(xml), $xml = $(xmlDoc);
    var data = xml.firstChild.children;
    var id1 = 0;
    var id2 = 0;
    for (var i= 0; i< data.length; i++){
        if ($(data[i]).attr('att') === "ATR"){
            $(data[i]).attr('id') == "id1" ? id1++ : id2++;
        }
    }

    document.getElementById("id1").innerHTML = id1;
    document.getElementById("id2").innerHTML = id2;

}
});

答案 1 :(得分:0)

XSLT 2.0解决方案

XSLT 2.0有distinct-values()有助于:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>

  <xsl:template match="/">
    <xsl:variable name="d" select="/"/>
    <xsl:for-each select="distinct-values(//*[@att='ATR']/@id)">
      <xsl:variable name="curId" select="."/>
      <xsl:value-of select="concat($curId,' ',count($d//*[@att='ATR' and @id = $curId]))"/>
      <xsl:text>&#xa;</xsl:text>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

XSLT 1.0解决方案 (也适用于XSLT 2.0)

XSLT 2.0缺少distinct-values(),但xsl:keygenerate-id()可以帮助迭代唯一值:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>

  <xsl:key name="idattr" match="//*[@att='ATR']/@id" use="." />

  <xsl:template match="/">
    <xsl:for-each select="//*[@att='ATR']/@id[generate-id() = 
                                              generate-id(key('idattr', .)[1])]">
      <xsl:variable name="curId" select="."/>
      <xsl:value-of select="concat($curId, ' ', count(//*[@att='ATR' and @id = $curId]))"/>
      <xsl:text>&#xa;</xsl:text>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

以上两种解决方案都会生成

id1 2
id2 1
根据要求