【问题标题】:Sorting with xslt 1.0使用 xslt 1.0 进行排序
【发布时间】:2010-11-15 10:58:46
【问题描述】:

我有很多用户填写的评估表。我在 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.

如果不清楚,如果您有任何解决此问题的建议,请告诉我。

提前致谢。

【问题讨论】:

  • 不完全清楚......“第二个问题的答案与第一个问题的答案不匹配”中的“匹配”是什么意思?您的示例输出似乎显示了第一个问题的第一个答案和第二个问题的第一个答案,在同一行,在适当的问题名称下。你期望的输出是什么?
  • 另外,我怀疑你是否真的想使用禁用输出转义,但这可能是一个单独的问题。

标签: xml xslt sorting


【解决方案1】:

在您的 for-each 中,上下文节点是一个 VALUE 元素,因此 xsl: sort 应该简单地执行 select="."

【讨论】:

    【解决方案2】:

    感谢大家的评论和回答。 它是 xml 结构中的东西,我正在按问题垂直查询答案,如果用户没有填写问题的内容,那么订单就会被错过,并且问题的答案不再按用户分组,所以您可以为一个用户回答第二个问题,但为另一个用户回答第三个问题,而不是同一个用户。 现在我还发现了用户未填写的问题。 这样,对于所有问题和用户的适当答案,我将获得相同的结果和相同的顺序。

    再次感谢。

    【讨论】:

    • 这应该是有问题的,而不是答案。
    【解决方案3】:

    当您不知道是否缺少字段时,这就像 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-06
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多