2016-02-04 117 views
0

我想統計XML中兩個節點之間存在的節點。下面是一個演示XML。統計兩個節點之間的特定節點的數量

<?xml version="1.0" encoding="UTF-8"?> 
<body> 
    <a></a> 
    <b></b> 
    <b></b> 
    <b></b> 
    <a></a> 
    <b></b> 
    <a></a> 
    <a></a> 
    <b></b> 
    <b></b> 
    <a></a> 
</body> 

而我正在使用下面的XSLT。

<xsl:template match="a"> 
    <xsl:text>Number of B </xsl:text> 
     <xsl:value-of select="count(preceding::a[1]/following::b)"/> 
    </xsl:template> 

我的當前輸出。

<body> 
     Number of B 0 
     <b></b> 
     <b></b> 
     <b></b> 
     Number of B 6 
     <b></b> 
     Number of B 3 
     Number of B 2 
     <b></b> 
     <b></b> 
     Number of B 2 

    </body> 

但是我的預期輸出如下。

<body> 
     Number of B 0 
     <b></b> 
     <b></b> 
     <b></b> 
     Number of B 3 
     <b></b> 
     Number of B 1 
     Number of B 0 
     <b></b> 
     <b></b> 
     Number of B 2 

    </body> 

這裏基本上我想要計算之間有史以來a

請讓我知道我該怎麼做到這一點。

這裏是工作示例

http://xsltransform.net/6r5Gh3F

感謝

回答

2

你可以做的是創造了b內容鏈接至其後的第一個關鍵a元素

<xsl:key name="b" match="b" use="generate-id(following-sibling::a[1])" /> 

然後你可以計算當前之前的b元素元素像這樣:

<xsl:value-of select="count(key('b', generate-id()))"/> 

試試這個XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:key name="b" match="b" use="generate-id(following-sibling::a[1])" /> 

    <xsl:template match="a"> 
     <xsl:text>Number of B </xsl:text> 
     <xsl:value-of select="count(key('b', generate-id()))"/> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

關鍵使用的好建議,加上一個。 –

1

你可以指望以下b數量的和減去b數量「後續的s以下a

<xsl:template match="a"> 
    <xsl:text>Number of B </xsl:text> 
    <xsl:value-of select="count(following::b) - count(following::a/following::b)"/> 
</xsl:template> 
+0

不錯的邏輯,再加上一個。 –

相關問題