我正在尝试对我所在城市内所有公交线路和公交车站的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 & 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 & King St NB">
<location>
<latitude>42.9835093</latitude>
<longitude>-81.2471596</longitude>
</location>
<routes>05, 09, 12, 19, 23</routes>
</stop>
编辑#2:XML没有名称空间。
答案 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中的错误位置。再次构建表达式,试图找出失败的位置。