Сравнить значение узла со строкой - PullRequest
1 голос
/ 09 декабря 2010

Ниже мой XML. Я хочу показать все значения AgentSales, если State = Talking Out

<AgentSales>
<AgentName>WRIGHT SIMMONS NATHANIEL</AgentName>
<State>Talking Out</State>
<Reason/>
<time>3</time></AgentSales>

вот мой XSLT

    <xsl:if test="/NewDataSet/AgentSales/State[text() = \'Talking Out\']">

  <xsl:sort data-type="number" select="time" order="descending"/> 
  <tr>

     <td><xsl:value-of select="AgentName"/></td>
         <td><xsl:value-of select="State"/></td>
     <td><xsl:value-of select="time"/></td>

  </tr>
</xsl:if>

Это моя ошибка

Ошибка загрузки таблицы стилей: не удалось выполнить синтаксический анализ таблицы стилей XSLT.

Blockquote

Ответы [ 3 ]

1 голос
/ 09 декабря 2010

Во-первых, вам не нужно «экранировать» апос, например \'Talking Out\', просто используйте 'Talking Out'.

Во-вторых, инструкция xsl:sort может быть только дочерней по отношению к xsl:apply-templates или xsl:for-each инструкции в XSLT 1.0

В-третьих, стиль XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="Agents">
        <table>
            <xsl:apply-templates>
                <xsl:sort select="time" data-type="number" order="descending"/>
            </xsl:apply-templates>
        </table>
    </xsl:template>
    <xsl:template match="AgentSales[State='Talking Out']">
        <tr>
            <xsl:apply-templates/>
        </tr>
    </xsl:template>
    <xsl:template match="AgentSales/*">
        <td>
            <xsl:value-of select="."/>
        </td>
    </xsl:template>
    <xsl:template match="AgentSales/Reason|AgentSales"/>
</xsl:stylesheet>

С этим входом:

<Agents>
    <AgentSales>
        <AgentName>WRIGHT SIMMONS NATHANIEL</AgentName>
        <State>Talking Out</State>
        <Reason>whatever</Reason>
        <time>3</time>
    </AgentSales>
    <AgentSales>
        <AgentName>SOMEONE</AgentName>
        <State>Talking In</State>
        <Reason>whatever</Reason>
        <time>2</time>
    </AgentSales>
    <AgentSales>
        <AgentName>SOMEONE ELSE</AgentName>
        <State>Talking Out</State>
        <Reason>whatever</Reason>
        <time>5</time>
    </AgentSales>
</Agents>

Выход:

<table>
    <tr>
        <td>SOMEONE ELSE</td>
        <td>Talking Out</td>
        <td>5</td>
    </tr>
    <tr>
        <td>WRIGHT SIMMONS NATHANIEL</td>
        <td>Talking Out</td>
        <td>3</td>
    </tr>
</table>
0 голосов
/ 09 декабря 2010

Используйте :

<xsl:template match="AgentName[../State='Talking Out']">
  <td><xsl:value-of select="."/></td>
</xsl:template>

Также , прочитайте хорошую книгу по XSLT, чтобы получить хотя бы основы: <xsl:template>, <xsl:for-each>, <xsl:sort>, правило идентификации и переопределение его, ... и т. Д.

0 голосов
/ 09 декабря 2010

В опубликованной вами таблице стилей есть две проблемы: a) вам не нужно отображать ', используя \, просто напишите 'Talking Out'. б) xsl:sort не может быть ребенком xsl:if.

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