xsl:如何计算不超过n个子项的项数

时间:2013-06-05 00:14:49

标签: xml xslt

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>

提前致谢

3 个答案:

答案 0 :(得分:2)

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

student[count(subject) &lt; 2]

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

count(/faculty/student/subject)

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

count(/faculty/student/subject[generate-id()=generate-id(key('name', @name)[1])])

答案 1 :(得分:1)

如果我尝试关注您的问题:

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

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

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

从您的示例XML和xslt中可以清楚地知道“items”应该是什么。我的解释是,这应该是主题名称 比:要计算不超过2次的主题名称,请尝试:

count(//subject[
         generate-id()=generate-id(key('name', @name)[1]) 
         and 
         count(key('name', @name) ) &lt;= 2  
       ] )

答案 2 :(得分: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>