1

xml文件:

<faculty>
<student name="a a" group="5">
    <subject date="2013-02-01" name="science">124</subject>
</student>

<student name="q q" group="9">
    <subject date="2013-02-01" name="my">124</subject>
</student>

<student name="z z" group="2">
</student>

<student name="v v" group="9">
    <subject date="2013-02-01" name="tro">tro</subject>
</student>
</faculty>

需求:如何统计不超过2个科目的项目数。

我知道如何显示所有这些项目和科目数,但我不知道如何计算科目总数:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:key name="name" match="subject" use="@name" />

<xsl:template match="subject">
    <xsl:if test="count(key('name', @name)) &lt; 2">
        subject: <xsl:value-of select="@name" />
        count: <xsl:value-of select="count(key('name', @name))" />
    </xsl:if>
</xsl:template>

提前致谢

4

3 回答 3

2

以下将匹配student具有少于 2subject个子元素的元素:

student[count(subject) &lt; 2]

如果您想要文档中的元素总数subject,请使用以下命令:

count(/faculty/student/subject)

如果您想要元素中不同@name值列表的计数:subject

count(/faculty/student/subject[generate-id()=generate-id(key('name', @name)[1])])
于 2013-06-05T01:06:11.777 回答
1

如果我尝试遵循您的问题:

Q1:如何计算不超过n个孩子的项目数量

这将是:count(items[count(*) &lt= $n ])

Q2:如何计算不超过2个科目的项目数。

从您的示例 XML 和 xslt 中并不清楚“项目”应该是什么。我的解释是这应该是主题名称。
比:要计算不超过 2 次的主题名称,请尝试以下操作:

count(//subject[
         generate-id()=generate-id(key('name', @name)[1]) 
         and 
         count(key('name', @name) ) &lt;= 2  
       ] )
于 2013-06-05T08:39:05.027 回答
0

如果您只需要显示subject仅出现一次的元素,请注意以下and count(key('subject-name', @name)) = 1部分:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:key name="subject-name" match="subject" use="@name" />
    <xsl:template match="faculty">
        <xsl:for-each select=".//subject[count(. | key('subject-name', @name)[1]) = 1 and count(key('subject-name', @name)) = 1]">
            <xsl:sort select="@name" />
            <xsl:value-of select="@name" />
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>
于 2013-06-05T01:19:04.787 回答