检查节点有多少个孩子

时间:2016-03-01 09:40:11

标签: xslt xpath

我有一个XML文件:

<manual>
    <chapter>
        <section />
        <section />
        <section />
    </chapter>
    <chapter>
        <section>
            <section />
            <section />
            <section />
            <section />
            <section />
            <section />
            <section />
            <section />
            <section />
            <section />
        </section>  
        <section />
        <section />
    </chapter>
</manual>

在我处理<manual>节点时,我想知道是否有一个<section>节点有超过9个子节点。

我最初的做法是:

if test="//section[count(child::section &gt; 9)]"

这不起作用,因为count()的输出是一个整数,而section []需要一个节点集。
像count(// section / section)这样的东西不会起作用,因为它会计算所有部分,而不仅仅是一组兄弟。

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:2)

我认为你想要//section[count(section) > 9],比较运算符不属于count函数调用,就像你拥有它一样。

答案 1 :(得分:0)

你可以使用count(./ section)+ count(./ section / section)来查找该节的总数,下面是用于了解节点位置和节数的代码

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"         xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/">
<xsl:for-each select="/manual/chapter">
<xsl:if test="count(./section) + count(./section/section) > 9">
<xsl:value-of select="position()"/>,<xsl:value-of select="count(./section)      + count(./section/section) "/>
</xsl:if>
</xsl:for-each>
  </xsl:template>

 </xsl:stylesheet>