Сортировать данные, когда не используется цикл for-each - PullRequest
2 голосов
/ 18 февраля 2011

Я хочу отсортировать мой XML в определенном порядке на основе значения узла «Причина»

У меня есть мой XML

  <AgentSales>
    <AgentName>MEYER RICK</AgentName>
    <State>Talking Out</State>
    <Reason>Undefined</Reason>
    <time>29:09</time>
  </AgentSales>
  <AgentSales>
    <AgentName>BALENTINE JAMES</AgentName>
    <State>Talking Out</State>
    <Reason>Undefined</Reason>
    <time>16:07</time>
  </AgentSales>
  <AgentSales>
    <AgentName>SHOEMAKER ERIC</AgentName>
    <State>Talking Out</State>
    <Reason>Undefined</Reason>
    <time>08:21</time>
  </AgentSales>
  <AgentSales>
    <AgentName>HARVEY MICHAEL</AgentName>
    <State>Talking Out</State>
    <Reason>Undefined</Reason>
    <time>02:11</time>
  </AgentSales>
  <AgentSales>
    <AgentName>MORRIS BRANDEN</AgentName>
    <State>Talking Out</State>
    <Reason>Undefined</Reason>
    <time>02:05</time>
  </AgentSales>
  <AgentSales>
    <AgentName>FORER DAVID</AgentName>
    <State>Talking Out</State>
    <Reason>Undefined</Reason>
    <time>01:15</time>
  </AgentSales>

и вот мой текущий стиль. Все, что он делает, это игнорирует любые AgentSales, которые имеют состояние «Разговор», но затем просто идут по линии и показывают оставшиеся данные как есть. Я хочу отсортировать данные по времени, пока не отображаются AgentSales с "Talking Out" и "Talking In". Я уверен, что мне просто нужно обновить свой выбор:

<xsl:apply-templates select="NewDataSet/AgentSales[State!=\'Talking Out\'] || NewDataSet/AgentSales[State!=\'Talking In\']"/>

Но как мне отсортировать оставшиеся данные?

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <body>
                <table cellpadding="3" cellspacing="0" width="390">
                    <tr>
                        <th style="text-align:left;"><span style="font:20px arial; font-weight:bold;">Agent Name</span></th>
                        <th style="text-align:center;"><span style="font:20px arial; font-weight:bold;">State</span></th>
                        <th style="text-align:center;"><span style="font:20px arial; font-weight:bold;">Time</span></th>
                    </tr>
                    <xsl:apply-templates select="NewDataSet/AgentSales[State!=\'Talking Out\']"/>
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="AgentSales">
        <tr>
            <xsl:if test="(position() mod 2 = 1)">
                <xsl:attribute name="bgcolor">#cccccc</xsl:attribute>
            </xsl:if>
            <td style="text-align:left;"><span style="font:14px arial; font-weight:bold;"><xsl:value-of select="AgentName"/></span></td>
            <td style="text-align:center;"><span style="font:14px arial; font-weight:bold;"><xsl:value-of select="State"/></span></td>
            <td style="text-align:center;"><span style="font:14px arial; font-weight:bold;"><xsl:value-of select="time"/></span></td>
        </tr>
    </xsl:template>

</xsl:stylesheet>

Ответы [ 2 ]

2 голосов
/ 18 февраля 2011

Использование :

<xsl:apply-templates select=
  "NewDataSet/AgentSales
           [not(State='Talking Out')
          and
            not(State='Talking In')
           ]
"> 
  <xsl:sort select="time"/>
<xsl:apply-templates 
2 голосов
/ 18 февраля 2011

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

<xsl:apply-templates select="NewDataSet/AgentSales[State!=\'Talking Out\']">
    <xsl:sort select="time" />
</xsl:apply-templates>

Вот более подробная статья , которая обсуждает это.

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