Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 对每个参数使用XSL?_Xml_Xslt - Fatal编程技术网

Xml 对每个参数使用XSL?

Xml 对每个参数使用XSL?,xml,xslt,Xml,Xslt,我正在尝试对我所在城市的所有公交线路和公交站点的XML文档进行XSL转换。在这样做的过程中,我使用for-each-select来选择包含作为参数传递的路由号的所有站点节点 当我运行我的程序时,似乎没有一个值被选中,我想知道我的语法是否无效,或者您是否可以在xsl:for每个select语句中使用参数 以下是我的xsl: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

我正在尝试对我所在城市的所有公交线路和公交站点的XML文档进行XSL转换。在这样做的过程中,我使用for-each-select来选择包含作为参数传递的路由号的所有站点节点

当我运行我的程序时,似乎没有一个值被选中,我想知道我的语法是否无效,或者您是否可以在xsl:for每个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没有名称空间。

包含函数使用字符串,而不是节点。这里需要的是一个简单的节点集比较:

<xsl:for-each select="allstops/stop[routes=$route_num]">
contains是一个字符串函数,即“foo”包含“o”。你用错了,你可能需要allstops/stop[routes=$route\u num]

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


仅从您的示例无法判断XPath中的错误在哪里。重新构建表达式,试图找出它失败的地方。

有些站点有多条路线通过它们,因此routes标签可能看起来像16,31,42@AaronG. 那么它应该看起来像163142。这里有XML,所以不要像CSV文件一样使用它。这不是我的XML文件,它是伦敦市交通委员会生成的XML文件。我只是在解释它,并试图对其使用XSLT。@Arong。请再次编辑您的问题,并包含多条路线的确切示例。@Arong。不要忘记包含XML可能具有的任何名称空间。如果有任何机会更改路由,则可以使用逗号分隔的列表部分,然后无论如何更改它。如果你坚持使用它,至少使用一些避免误报的东西,例如6也匹配16:ContainesConcat',',translateroutes',',',',contcat',',$route_num','。是的,这很难看,但这是错误使用XML的直接后果。除了上面Tomalak解释的潜在误报问题之外,没有理由说明select语句不起作用。也就是说,从您发布的部分代码中看不到任何原因。你检查过参数是否成功地传递到样式表了吗?基本上就是这样。正在用C编写到WebBrowser控件的XSLT转换。似乎它甚至没有用select语句输入for-each。这可能是模板匹配吗?这一定与我编写WebBrowser控件有关,因为它完全跳过了XSLT中的xsl:for-each。