Сортировка с помощью xslt 1.0 - PullRequest
0 голосов
/ 15 ноября 2010

У меня есть форма оценки, заполненная многими пользователями. Я создал экспорт в Excel для этой формы. Чего я хочу добиться: в заголовке Excel будут все вопросы, а под каждым вопросом - ответы, сгруппированные пользователем, заполнившим форму. Для этого я получаю вопросы по форме оценки и упорядочиваю их по позициям, затем группирую пользователей, заполнивших форму, просматривая результаты группировки, чтобы у меня были одинаковые строки для каждого вопроса. это часть xml, которую я генерирую:

<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.

дайте мне знать, если неясно, и если у вас есть какие-либо предложения для решения этой проблемы.

спасибо заранее.

Ответы [ 3 ]

1 голос
/ 15 ноября 2010

В вашем for-each узел контекста является элементом VALUE, поэтому xsl: sort должен просто выполнить select=".".

0 голосов
/ 16 ноября 2010

Это похоже на вывод 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>
0 голосов
/ 15 ноября 2010

спасибо всем вам за ваши ремкры и ответы.это было что-то в структуре xml, я запрашивал ответы на вопросы по вертикали, и если пользователь не заполнил что-то для вопроса, то порядок упускается, а ответы по вопросам больше не группируются по пользователюВы можете получить ответ на второй вопрос для пользователя, но ответ на третий вопрос для другого пользователя, а не тот же.теперь я также улавливаю вопросы, которые пользователь не задал. Таким образом, у меня будут одинаковые результаты и одинаковый порядок для всех вопросов и соответствующих ответов пользователя.

еще раз спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...