XSLT中xsl:template的select语句带参数匹配问题
解决从XML中匹配指定路线站点的问题
看起来你需要实现的功能是:从HTML输入框获取路线号,然后从XML文件里找出所有包含该路线的站点。我来给你一步步拆解解决方案,不管是前端JS还是后端Python都有对应的实现方式,你可以根据自己的场景选择。
首先先补全你给出的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.891234</latitude> <longitude>-81.305678</longitude> </location> <routes>28, 15</routes> </stop> <stop number="105" name="King & Richmond WB"> <location> <latitude>42.901111</latitude> <longitude>-81.289999</longitude> </location> <routes>15</routes> </stop> </allstops>
方案一:前端JavaScript实现(纯浏览器端)
先写HTML结构,包含输入框、触发按钮和结果展示区:
<input type="text" id="routeInput" placeholder="输入路线号,比如28"> <button onclick="findStopsForRoute()">查找对应站点</button> <div id="results"></div>
然后是核心的JavaScript逻辑,负责获取输入、解析XML、匹配站点并展示结果:
function findStopsForRoute() { // 1. 获取并校验输入的路线号 const routeNumber = document.getElementById('routeInput').value.trim(); if (!routeNumber) { document.getElementById('results').textContent = '请输入有效的路线号哦'; return; } // 2. 这里如果你的XML是服务器上的文件,替换成fetch请求(后面会说),先模拟XML内容 const xmlString = ` <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.891234</latitude> <longitude>-81.305678</longitude> </location> <routes>28, 15</routes> </stop> <stop number="105" name="King & Richmond WB"> <location> <latitude>42.901111</latitude> <longitude>-81.289999</longitude> </location> <routes>15</routes> </stop> </allstops> `; // 3. 解析XML文档 const parser = new DOMParser(); const xmlDoc = parser.parseFromString(xmlString, 'text/xml'); // 4. 用XPath精准匹配包含目标路线的站点 // 这里的写法是为了避免误匹配,比如不会把"281"当成"28" const xpathQuery = `//stop[routes[contains(concat(', ', normalize-space(.), ', '), ', ${routeNumber}, ')]]`; const matchedStops = xmlDoc.evaluate(xpathQuery, xmlDoc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); // 5. 渲染结果 const resultsDiv = document.getElementById('results'); resultsDiv.innerHTML = ''; if (matchedStops.snapshotLength === 0) { resultsDiv.textContent = `没有找到包含路线${routeNumber}的站点`; return; } const resultList = document.createElement('ul'); for (let i = 0; i < matchedStops.snapshotLength; i++) { const stop = matchedStops.snapshotItem(i); const stopInfo = ` <li> <strong>站点编号:${stop.getAttribute('number')}</strong><br> 站点名称:${stop.getAttribute('name')}<br> 坐标:${stop.querySelector('latitude').textContent}, ${stop.querySelector('longitude').textContent} </li> `; resultList.innerHTML += stopInfo; } resultsDiv.appendChild(resultList); }
如果你的XML是放在服务器上的文件,把上面的模拟xmlString替换成fetch请求即可:
// 替换原来的xmlString部分 fetch('你的XML文件路径,比如/stops.xml') .then(response => { if (!response.ok) throw new Error('加载XML失败'); return response.text(); }) .then(xmlString => { // 这里和上面的解析、匹配逻辑完全一样 const parser = new DOMParser(); const xmlDoc = parser.parseFromString(xmlString, 'text/xml'); // ... 后续代码省略,和之前一致 }) .catch(err => { document.getElementById('results').textContent = err.message; });
方案二:后端Python实现(适合大XML文件或需要更复杂处理的场景)
如果你的XML文件比较大,或者需要做后续的服务器端处理,用Python会更高效。这里用Python内置的xml.etree.ElementTree库来实现:
import xml.etree.ElementTree as ET def get_stops_by_route(xml_file_path, target_route): """从XML文件中找出所有包含指定路线的站点""" try: tree = ET.parse(xml_file_path) root = tree.getroot() except FileNotFoundError: return f"错误:未找到XML文件 {xml_file_path}" except ET.ParseError: return "错误:XML文件格式无效" matched_stops = [] for stop in root.findall('stop'): # 处理路线字符串,分割成列表并去除空格 routes_text = stop.find('routes').text.strip() route_list = [route.strip() for route in routes_text.split(',')] if target_route in route_list: # 提取站点信息 stop_data = { "number": stop.get("number"), "name": stop.get("name"), "latitude": stop.find("location/latitude").text, "longitude": stop.find("location/longitude").text } matched_stops.append(stop_data) return matched_stops # 使用示例 if __name__ == "__main__": result = get_stops_by_route("stops.xml", "28") if isinstance(result, list): if not result: print("没有找到对应路线的站点") else: for stop in result: print(f"编号: {stop['number']}, 名称: {stop['name']}, 坐标: {stop['latitude']}, {stop['longitude']}") else: print(result)
关键注意点
- 精准匹配:不管用XPath还是Python分割,都要处理多路线的情况,避免误匹配(比如把"281"识别成"28")
- 输入校验:一定要检查用户输入的合法性,比如空值、非预期格式的内容
- 性能优化:如果XML文件很大,优先用后端处理,前端解析大XML会占用较多浏览器资源
内容的提问来源于stack exchange,提问作者sawyer seguin
相关产品推荐
相关产品推荐

