节点计数和出现 - XSL

use*_*093 3 xml xslt

我需要编写通用xsl,它将接收xml文档并输出节点数及其名称.所以如果我有一个像下面这样的文件:

   <assets>
    <asset>
        <type>hardware</type>
        <item>
            <name>HP laptop</name>
            <value>799</value>
        </item>
        <item>
            <name>server</name>
            <value>1000</value>
        </item>
        <item>
            <name>ViewSonic Monitor</name>
            <value>399</value>
        </item>
    </asset>
    <asset>
        <type>software</type>
        <item>
            <name>Windows Vista</name>
            <value>399</value>
        </item>
        <item>
            <name>Office XP</name>
            <value>499</value>
        </item>
        <item>
            <name>Windows 7</name>
            <value>399</value>
        </item>
          <item>
            <name>MS Project Professional 2007</name>
            <value>299</value>
          </item>
       </asset>
    </assets>
Run Code Online (Sandbox Code Playgroud)

输出将是:

   <output>
    <node name="assets" count="1"/>
    <node name="asset" count="2"/>
    <node name= "type" count="??"/>
    <node name="item" count=??/>
    <node name="name" count=??/>
    <node name="value" count=??/>
    </output>
Run Code Online (Sandbox Code Playgroud)

Gav*_*ler 8

你会想要使用count函数:

<xsl:value-of select="count(assets/asset)" />
Run Code Online (Sandbox Code Playgroud)

所以你的代码看起来像:

Assets: <xsl:value-of select="count(assets)" />
Asset:  <xsl:value-of select="count(assets/asset)" />
Item:   <xsl:value-of select="count(assets/asset/item)" />
Run Code Online (Sandbox Code Playgroud)


Juk*_*nen 5

可以使用Muenchian方法来完成包含任何名称的节点的输入的通用解决方案:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:key name="nodes-by-name" match="*" use="name()"/>
  <xsl:template match="/">
    <output>
      <xsl:for-each select="//*[count(.|key('nodes-by-name', name())[1]) = 1]">
        <node name="{name()}" count="{count(key('nodes-by-name', name()))}"/>
      </xsl:for-each>
    </output>
  </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

说明:使用xsl:key,创建从名称到具有该名称的节点的映射。然后遍历所有唯一名称,并输出该名称的节点数。这里的主要技巧是如何遍历唯一的名称。请参阅链接的页面,以获取对count(.|foo)=1用于确定是否foo仅包含上下文节点的节点集的惯用语的说明。