2010-12-09 64 views
1

下面是我的XML我想显示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样式表失败。

块引用

回答

1

首先,您不需要“逃避”像\'Talking Out\'这样的错误,只需使用'Talking Out'即可。

其次,xsl:sort指令只能是xsl:apply-templatesxsl: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

有两个问题在您发布的样式表:1)你不需要使用\筛选',只写'Talking Out'。 b)xsl:sort不能是xsl:if的子女。

+0

“\”在那里,因为这是更大的PHP脚本的一部分。我会排除一下,看看我能得到什么。 – Denoteone 2010-12-09 17:04:16

0

使用

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

此外,阅读XSLT好书至少拿到基本面:<xsl:template><xsl:for-each><xsl:sort>,身份规则和覆盖它,...等

+0

谢谢我在w3schools上花了很多时间,但没有得到太多的帮助。 – Denoteone 2010-12-09 17:03:56

+0

通过w3schools学习XSLT并不是一个好主意。你应该更好地阅读迈克尔凯的书籍和规范。 – Flack 2010-12-09 17:23:55