2010-03-31 47 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