我需要编写通用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)
你会想要使用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)
可以使用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仅包含上下文节点的节点集的惯用语的说明。
| 归档时间: |
|
| 查看次数: |
36472 次 |
| 最近记录: |