我遇到以下代码问题。此代码从html页面中的文本框中获取值,然后从包含传入值的xml文件中获取所有路径
XML:
<allstops>
<stop number="2504" name="Main & Bainard EB">
<location>
<latitude>42.91033567</latitude>
<longitude>-81.29671483</longitude>
</location>
<routes>28</routes>
</stop>
<stop number="20" name="Adelaide & Ada NB">
<location>
<latitude>42.9742886</latitude>
<longitude>-81.2252341</longitude>
</location>
<routes>16</routes>
</stop>
<stop number="22" name="Adelaide & Central Ave NB">
<location>
<latitude>42.9945666</latitude>
<longitude>-81.2343441</longitude>
</location>
<routes>16</routes>
</stop>
XSLT:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsfot-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="html" indent="yes" />
<xsl:param name="route" select="0"/>
<xsl:template match="/">
<h1>
<font face="Verdana">
LTC Stops on route <xsl:value-of select="$route"/>.
</font>
</h1>
<h2>
<font face="Verdana">
<xsl:value-of select="count(//routes[contains(text(), $route)])"/> stops found.
</font>
</h2>
<table style="width:720px" border="3">
<tr>
<th>
<font face="Verdana" size="4">STOP #</font>
</th>
<th>
<font face="Verdana" size="4">STOP NAME</font>
</th>
<th>
<font face="Verdana" size="4">LAT</font>
</th>
<th>
<font face="Verdana" size="4">LONG</font>
</th>
<th>
<font face="Verdana" size="4">ROUTES</font>
</th>
</tr>
<xsl:apply-templates select="//routes[contains(text(), $route)]" >
<xsl:sort data-type="number" select="../@number" />
</xsl:apply-templates>
</table>
</xsl:template>
<xsl:template match="routes">
<xsl:element name="tr">
<xsl:element name="td">
<xsl:value-of select="../@number"/>
</xsl:element>
<xsl:element name="td">
<xsl:value-of select="../@name"/>
</xsl:element>
<xsl:element name="td">
<xsl:value-of select="../location/latitude"/>
</xsl:element>
<xsl:element name="td">
<xsl:value-of select="../location/longitude"/>
</xsl:element>
<xsl:element name="td">
<xsl:value-of select="."/>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
此代码有效,但有一个问题。如果用户输入路线号码&#39; 1&#39;它将匹配路线&#39; 10&#39; &#39; 11&#39; &#39; 12&#39;等等,只要路线包含第一名。另请注意,某些路由包含多个用逗号分隔的数字; 01,16,24。在这种情况下,用户输入&#39; 01&#39;应该仍然得到号码为“01,16,24&#39;”的路线。
答案 0 :(得分:0)
当您使用XSLT 1.0时,一种方法是这样做......
<xsl:variable name="paddedRoute" select="concat(',', $route, ',')"/>
<xsl:value-of select="count(//routes[contains(concat(',', translate(text(), ' ', ''), ','), $paddedRoute)])"/>
如果所有translate
元素都不包含空格,您可以删除routes
<xsl:value-of select="count(//routes[contains(concat(',', text(), ','), $paddedRoute)])"/>
请注意,路径应该真正作为字符串传递...
<xsl:param name="route" select="'16'"/>
答案 1 :(得分:0)
您为什么使用contains()
?你肯定想要一个平等测试吗?变化
//routes[contains(text(), $route)]
到
//routes[. = $route]