2013-07-15 48 views
1

我輸入XML:XSLT遞增變量for-each循環不工作

<Citizens> 
    <Category type="Plumbers"> 
    <Citizen>John</Citizen> 
    </Category> 
    <Category type="Doctors"> 
    <Citizen>Ram</Citizen> 
    <Citizen>Kumar</Citizen> 
    </Category> 
    <Category type="Farmers"> 
    <Citizen>Ganesh</Citizen> 
    <Citizen>Suresh</Citizen> 
    </Category> 
</Citizens> 

我曾嘗試以下XSLT來算Citizen無關的Category

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:template match="/"> 
     <xsl:variable name="citizenTotal" select="0" /> 
     <xsl:for-each select="Citizens/Category"> 
      <xsl:variable name="currentCount" select="count(Citizen)" /> 
      <xsl:variable name="citizenTotal" select="$citizenTotal+$currentCount" /> 
     </xsl:for-each> 
     Total Citizen nodes: <xsl:value-of select="$citizenTotal"></xsl:value-of> 
    </xsl:template> 
</xsl:stylesheet> 

預期的輸出爲5,但它給出0是for-each之外的初始值。我錯過了/與其範圍<xsl:variable/>搞亂。我只是嘗試了我通常對JSLT所做的默認範圍爲page的操作。類似XSLT中提到XSLT中變量範圍的內容?

回答

1

問題是變量在xslt中是不可變的。設置後不可能改變它。

因此您將citizenTotal = 0賦值。儘管您爲for循環中的每個變量指定了一個新的變量,但是您爲其中的另一個「賦值」變量指定了相同的名稱。當你退出時 - 你已經超出了它的範圍 - 你得到的只是你在循環之前聲明的變量,它被設置爲零。

如果需要全體公民的總數,你可以使用XPath做沒有循環count(//Citizens/Category/Citizen)

4

在XSL 1.0中,您無法增加全局變量。您可以通過具有Saxon在命名空間

<xsl:stylesheet version="2.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:saxon="http://saxon.sf.net/" extension-element-prefixes="saxon" 
      exclude-result-prefixes="saxon"> 

創建變量

<xsl:variable name="count" saxon:assignable="yes" select="0"/> 

增量

<saxon:assign name="count"><xsl:value-of select="$count+1"/></saxon:assign> 
通過

<xsl:for-each select="Citizens/Category"> 
     <xsl:if test="position()=last()"> 
      Total Citizen nodes: <xsl:value-of select="position()"/> 
     </xsl:if> 
    </xsl:for-each> 

但是在XSLT 2.0實現這個東西,你可以有全局變量

+1

我認爲這個問題通過所有類別統計的公民 - 這可能是'的'可能夠了。 –

+0

你是對的@JirkaŠ。 – rags

+1

Saxon!= XSLT 2.0。 XSLT 2.0是一種標準,在創建之後,您仍然無法修改變量。撒克遜人可能有一個允許修改變量的_extension_。 –