2010-11-15 85 views
0

我有許多用戶填寫的評估表。我在這個表格的excel中創建了一個導出。 我想實現的是:excel的標題將包含所有問題,並在每個問題下面填寫表單的用戶分組的答案。 爲此,我通過評估表單收到問題並按位置排序,然後我將填入表單的用戶分組,然後循環顯示分組的結果,以便每個問題都有相同的行。 這是XML我生成的一部分:使用xslt 1.0排序

<QUESTIONNAMES> 
    <ITEM> 
     <QUESID>468</QUESID> 
     <QUESNAME><![CDATA[Name]]></QUESNAME> 
    </ITEM> 
    <ITEM> 
     <QUESID>554</QUESID> 
     <QUESNAME><![CDATA[Palce]]></QUESNAME> 
    </ITEM> 
</QUESTIONNAMES> 
<EXPORTLINE> 
     <ITEMS> 
     <ITEM> 
      <QUESID>468</QUESID> 
      <VALUES> 
      <UserID>25151</UserID> 
      <VALUE><![CDATA[dommel]]></VALUE> 
      <UserID>45372</UserID> 
      <VALUE><![CDATA[Omnium]]></VALUE> 
      <UserID>54632</UserID> 
      <VALUE><![CDATA[Het Zand]]></VALUE> 
      <UserID>56604</UserID> 
      <VALUE><![CDATA[rijen]]></VALUE> 
      <UserID>57103</UserID> 
      <VALUE><![CDATA[Schanswiel]]></VALUE> 
      ------ 
      </VALUES> 
     </ITEM> 
     </ITEMS> 
</EXPORTLINE> 
<EXPORTLINE> 
     <ITEMS> 
     <ITEM> 
      <QUESID>554</QUESID> 
      <VALUES> 
      <UserID>22523</UserID> 
      <VALUE><![CDATA[test,test]]></VALUE> 
      <UserID>44308</UserID> 
      <VALUE><![CDATA[Ede]]></VALUE> 
      <UserID>47850</UserID> 
      <VALUE><![CDATA[Drachten]]></VALUE> 
      <UserID>50156</UserID> 
      <VALUE><![CDATA[Dalfsen]]></VALUE> 
      <UserID>50656</UserID> 
      <VALUE><![CDATA[Dongen]]></VALUE> 
      ----- 
      </VALUES> 
     </ITEM> 
     </ITEMS> 
</EXPORTLINE> 

這是我的XSLT部分:

<xsl:template name="enquteQuestions"> 
<tr> 
    <xsl:for-each select="QUESTIONNAMES/ITEM"> 
     <td align="left"><xsl:value-of select="QUESNAME" /></td> 
    </xsl:for-each> 
</tr> 
<tr> 
    <xsl:for-each select="QUESTIONNAMES/ITEM"> 
     <xsl:variable name="quesid" select="QUESID" /> 
     <td align="left"> 
      <xsl:for-each select="EXPORTLINE/ITEMS/ITEM[QUESID=$quesid]/VALUES/VALUE"> 
       <xsl:sort select="VALUE"/> 
       <xsl:value-of disable-output-escaping="yes" select="." /><br /> 
      </xsl:for-each>   
     </td> 
    </xsl:for-each> 
</tr> 

的問題是:在Excel文件中,答案是不匹配,我的意思是第二個問題的答案與第一個答案不匹配。

現在我有:

Name   |Place 
-------------------------- 
dommel   | test, test ----> i need to make sure that the answers of the second question match the answer of the first question. 

讓我知道,如果它是不明確的,如果您有任何建議來解決這個問題。

在此先感謝。

+0

還不完全清楚...你是什麼在「「匹配」指的是第二個問題的答案不匹配的第一個問題的答案「?您的示例輸出似乎在適當的問題名稱下顯示第一個問題的第一個答案,以及第二個問題的第一個答案,在同一行上。你期望的輸出是什麼? – LarsH 2010-11-15 11:45:26

+0

另外,我懷疑你是否真的想使用disable-output-escaping,但這可能是一個單獨的問題。 – LarsH 2010-11-15 11:47:23

回答

1

在你的for-each中,上下文節點是一個VALUE元素,因此xsl:sort應該簡單地做select="."

0

感謝你們所有人爲你的remakrs和答案。 它是在xml的結構中的東西,我垂直問題的答案是問號垂直,如果用戶沒有填寫問題的話,那麼順序越來越錯過了,問題的答案不再由用戶分組,所以你可以爲用戶回答第二個問題,但是第三個問題的答案是另一個用戶,而不是同一個用戶。 現在我也捕捉到用戶沒有填寫的問題。 這樣我就會得到相同的結果和相同的順序,所有questiosn和用戶的相應答案。

再次感謝。

+0

這應該是有問題的,而不是回答。 – 2010-11-15 22:28:24

0

這就像是一個CVS輸出,當你不知道是否缺少字段(用戶在這種情況下的答案)。所以,這個樣式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="kUserIDByValue" match="UserID" use="."/> 
    <xsl:key name="kValueByQuestion-User" match="VALUE" 
      use="concat(../../QUESID,'++',preceding-sibling::UserID[1])"/> 
    <xsl:variable name="vQuestions" select="/*/QUESTIONNAMES/ITEM/QUESID"/> 
    <xsl:template match="text()"/> 
    <xsl:template match="/"> 
     <table> 
      <xsl:apply-templates/> 
     </table> 
    </xsl:template> 
    <xsl:template match="QUESTIONNAMES"> 
     <tr> 
      <xsl:apply-templates/> 
     </tr> 
    </xsl:template> 
    <xsl:template match="QUESNAME"> 
     <td> 
      <xsl:value-of select="."/> 
     </td> 
    </xsl:template> 
    <xsl:template match="UserID[count(.|key('kUserIDByValue',.)[1])=1]"> 
     <tr> 
      <xsl:apply-templates select="$vQuestions" mode="output"> 
       <xsl:with-param name="pUserId" select="."/> 
      </xsl:apply-templates> 
     </tr> 
    </xsl:template> 
    <xsl:template match="QUESID" mode="output"> 
     <xsl:param name="pUserId"/> 
     <td> 
      <xsl:value-of select="key('kValueByQuestion-User', 
             concat(.,'++',$pUserId))"/> 
     </td> 
    </xsl:template> 
</xsl:stylesheet> 

輸出:

<table> 
    <tr> 
     <td>Name</td> 
     <td>Palce</td> 
    </tr> 
    <tr> 
     <td>dommel</td> 
     <td></td> 
    </tr> 
    <tr> 
     <td>Omnium</td> 
     <td></td> 
    </tr> 
    <tr> 
     <td>Het Zand</td> 
     <td></td> 
    </tr> 
    <tr> 
     <td>rijen</td> 
     <td></td> 
    </tr> 
    <tr> 
     <td>Schanswiel</td> 
     <td></td> 
    </tr> 
    <tr> 
     <td></td> 
     <td>test,test</td> 
    </tr> 
    <tr> 
     <td></td> 
     <td>Ede</td> 
    </tr> 
    <tr> 
     <td></td> 
     <td>Drachten</td> 
    </tr> 
    <tr> 
     <td></td> 
     <td>Dalfsen</td> 
    </tr> 
    <tr> 
     <td></td> 
     <td>Dongen</td> 
    </tr> 
</table>