将Node值与string进行比较

时间:2010-12-09 16:49:35

标签: xslt

下面是我的XML我希望在State = Talking Out

时显示AgentSales的所有值
<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样式表失败。

块引用

3 个答案:

答案 0 :(得分:1)

首先,您不需要像\'Talking Out\'那样“逃避”,只需使用'Talking Out'

其次,xsl:sort指令只能是XSLT 1.0中xsl:apply-templatesxsl:for-each指令的子指令

第三,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>

答案 1 :(得分:0)

您发布的样式表中存在两个问题:a)您无需使用'来屏蔽\,只需编写'Talking Out'即可。 b)xsl:sort不能是xsl:if的孩子。

答案 2 :(得分:0)

使用

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

,请阅读一本关于XSLT的好书,以获得至少基本原则:<xsl:template><xsl:for-each><xsl:sort>,身份规则并覆盖它, ......等等。