2010-11-15 86 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>