2017-10-05 45 views
0

考慮一個案例,我必須得到通過的學生人數,如果他通過了所有考試,他會被認爲通過。如何在xslt中將變量加1?

<testResults version="1.2"> 
<student test="1" pass="true" name="A"></student> 
<student test="2" pass="true" name="A"></student> 
<student test="1" pass="false" name="B"></student> 
<student test="2" pass="true" name="B"></student> 
<student test="1" pass="false" name="C"></student> 
<student test="2" pass="false" name="C"></student> 
<student test="1" pass="true" name="D"></student> 
<student test="2" pass="true" name="D"></student> 
</testResults> 

我想獲得通過所有科目的學生人數。我怎麼做? 我得到了一種方法,我遍歷所有的學生,並顯示誰通過了所有,但我如何得到所有學生的人數。

我使用,

<xsl:for-each select="/testResults/student/[not(@name = preceding::*/@name)]"> 
<xsl:variable name="allFailureCount" select="count(/testResults/*[attribute::pass='false'][@tn = current()/@name])" /> 
<xsl:choose> 
<xsl:when test="$allFailureCount &gt; 0"></xsl:when> 
<xsl:otherwise><xsl:value-of select="@name" /></xsl:otherwise> 
</xsl:choose> 
</xsl:for-each> 
+0

你可以編輯你的問題,顯示你的當前方法,讓學生誰通過?謝謝 –

+0

簡單的答案是,你沒有。在XSLT中,您無法更改變量的值,您可以將其設置爲一次,就是這樣。 (是的,我知道這聽起來很奇怪。)如果你想計算一些東西,你只需調用'count()'XPath函數。 – biziclop

+0

嗨@biziclop您如何使用XPath計數函數? –

回答

1

你所需要的就是的學生名字的「獨特」的計數,爲學生誰通過了所有的考試。它可能會幫助,如果你定義的鍵來查找測試

<xsl:key name="students" match="student" use="@name" /> 

然後,讓路過的學生的不同的列表中,您可以在XSLT 2.0

distinct-values(testResults/student[not(key('students', @name)/@pass='false')]/@name) 

使用distinct-values試試這個XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="text" /> 

    <xsl:key name="students" match="student" use="@name" /> 

    <xsl:template match="/"> 
     <xsl:variable name="passedStudents" select="distinct-values(testResults/student[not(key('students', @name)/@pass='false')]/@name)" /> 

     <xsl:for-each select="$passedStudents"> 
      <xsl:text>Student </xsl:text><xsl:value-of select="." /><xsl:text>&#10;</xsl:text> 
     </xsl:for-each> 
     <xsl:text>Total </xsl:text> 
     <xsl:value-of select="count($passedStudents)" /> 
    </xsl:template> 
</xsl:stylesheet> 
0

像這樣的東西可能工作

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes" /> 
    <xsl:template match="/"> 
     <result> 
     <xsl:variable name="prods" select="testResults/student/name" /> 
     <xsl:for-each select="$prods"> 
      <xsl:if test="generate-id() = generate-id($prods[. = current()][1])"> 
       <xsl:if test="count(/testResults/student[@pass ='true' and name=current()]) = 2"> 
        <name> 
        <xsl:value-of select="." /> 
        </name> 
       </xsl:if> 
      </xsl:if> 
     </xsl:for-each> 
     </result> 
    </xsl:template> 
</xsl:stylesheet> 

輸出

<result> 
    <name>A</name> 
    <name>D</name> 
</result> 

首先,它的構造方法使用方法從How to use XSLT to create distinct values獨特的名單 - 然後計數匹配2個條件的節點數 - 傳遞爲真並且名稱與當前的un相等ique名稱。如果count等於測試次數(2 - 我將其設置爲硬編碼) - 名稱將添加到輸出中。

編輯

要數名字 - 你可以將它們保存到臨時變種,然後用簡單的計數

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes" /> 
    <xsl:template match="/"> 
     <xsl:variable name="prods" select="testResults/student/name" /> 
     <xsl:variable name="passOne"> 
     <xsl:for-each select="$prods"> 
      <xsl:if test="generate-id() = generate-id($prods[. = current()][1])"> 
       <xsl:if test="count(/testResults/student[@pass ='true' and name=current()]) = 2"> 
        <name> 
        <xsl:value-of select="." /> 
        </name> 
       </xsl:if> 
      </xsl:if> 
     </xsl:for-each> 
     </xsl:variable> 
     <xsl:value-of select="count($passOne/name)" /> 
    </xsl:template> 
</xsl:stylesheet> 
+0

謝謝,@ artemy-vysotsky我真的很想找到那些被發現的人,我有一個類似你的方法!但是,問題是增加一個變量值,以便我可以對它們進行計數。任何其他方法來計數也很好。 –

+1

增加了統計發現名稱的可能性 –