2010-03-31 46 views
3

我希望能够使用XSL对XML文件中的“端点”进行计数。 通过端点我的意思是没有儿童包含数据的标签。使用XSL计算XML中的端点

<xmlsnippet> 
    <tag1>NOTENOUGHDAYS</tag1> 
    <tag2>INVALIDINPUTS</tag2> 
    <tag3> 
     <tag4> 
      <tag5>2</tag5> 
      <tag6>1</tag6> 
     </tag4> 
    </tag3> 
</xmlsnippet> 

此XML应该返回4,因为有

+0

你是指没有子节点的节点?我们还需要知道您想使用哪种语言,否则您将得到一个松散的伪代码答案。 – thecoshman 2010-03-31 09:05:19

+0

使用XSL。 XML格式非常松散,所以我想要计算任何没有子节点但可能包含数据的东西。 – Chris 2010-03-31 09:10:32

回答

6
<xsl:template match="/> 
    <xsl:value-of select="count(//*[not(*) and normalize-space() != ''])" /> 
</xsl:template> 

这通过后代轴(//)递归整个XML树,查找所有元素节点不具有子元素节点(not(*)),并含有比空白(normalize-space() != '')等数据(*)。

生成的节点集计数(并在您的情况下返回4)。

+0

这看起来不错,但我发布的XML只是一个片段,所以我需要调用类似于'select =“count(// ParentTag/xmlsnippet/* [not(*)and normalize-space()!='']) “' - 这会返回2而不是4.我做错了什么? – Chris 2010-03-31 09:42:00

+1

啊哈,我用这个,它工作'select =“计数(ParentTag/xmlsnippet // * [不(*)和normalize-space()!=''])”' – Chris 2010-03-31 09:42:59

3

*[not(*)]用于没有子单元的单元4 “终点”。

编辑:计数他们只使用count(elements)

+0

如何递归执行此操作? – Chris 2010-03-31 09:13:36

2

尝试: -

<xsl:variable name="numOfLeafNodes" select="count(//*[not(*)])" /> 

这会告诉你,叶子节点是多少,在整个XML正在转变中。使用: -

<xsl:variable name="numOfLeafNodes" select="count(.//*[not(*)])" /> 

找到当前上下文节点的后代的叶节点的计数。

+0

如果我这样做''那么它返回2而不是4 – Chris 2010-03-31 09:28:57

+0

@Chris:的确,但这将返回4:'count(ParentTag/xmlsnippet // * [not(*)])'注意''//'',这是'descendents ::'轴的快捷方式。也注意到我错过了实际的计数函数本身。 – AnthonyWJones 2010-03-31 10:02:16