使用XSL For-Each和参数?

时间:2014-06-01 06:39:54

标签: xml xslt

我正在尝试对我所在城市内所有公交线路和公交车站的XML文档进行XSL转换。在这样做时,我使用for-each选项,选择包含我作为参数传入的路径号的所有“停止”节点。

当我去运行我的程序时,似乎没有任何值被选中,我想知道我的语法是无效还是你不能在xsl:for-each select语句中使用参数?

这是我的xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:param name="route_num"></xsl:param>
  <xsl:param name="num_stops" />

  <xsl:template match="/">
    <!-- ... -->
    <xsl:for-each select="allstops/stop[contains(routes,$route_num)]">
      <xsl:sort select="@number"/>
        <tr>
        <td><xsl:value-of select="@number"/></td>
        <td><xsl:value-of select="@name"/></td>
        <td><xsl:value-of select="location/latitude"/></td>
        <td><xsl:value-of select="location/longitude"/></td>
        <td><xsl:value-of select="routes"/></td>
       </tr>
    </xsl:for-each>
    <!-- ... -->
  </xsl:template>
</xsl:stylesheet>

以下是XML的示例:

<stop number="20" name="Adelaide &amp; Ada NB">
    <location>
      <latitude>42.9742886</latitude>
      <longitude>-81.2252341</longitude>
    </location>
    <routes>16</routes>
</stop>

所以假设一个XML节点包含一个16的路由,它应该通过所有节点并将数据拉入我设置的字段,除非我的语法错误的XSL应该不是吗?

编辑:routes标签可以包含多个路由号,这就是我一直在使用contains

的原因
<stop number="408" name="Clarence &amp; King St NB">
    <location>
      <latitude>42.9835093</latitude>
      <longitude>-81.2471596</longitude>
    </location>
    <routes>05, 09, 12, 19, 23</routes>
</stop>

编辑#2:XML没有名称空间。

2 个答案:

答案 0 :(得分:0)

contains()函数适用于字符串,而不适用于节点。您需要的是一个简单的节点集比较:

<xsl:for-each select="allstops/stop[routes=$route_num]">

答案 1 :(得分:0)

contains()是一个字符串函数(即'foo'包含'o')。你错了,你可能想要allstops/stop[routes = $route_num]

除此之外 - 是的,可以在XPath表达式中使用参数值或变量,<xsl:for-each>将使用XPath返回的任何内容。

仅从您的示例中就无法确定XPath中的错误位置。再次构建表达式,试图找出失败的位置。