You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XSLT中xsl:template的select语句带参数匹配问题

解决从XML中匹配指定路线站点的问题

看起来你需要实现的功能是:从HTML输入框获取路线号,然后从XML文件里找出所有包含该路线的站点。我来给你一步步拆解解决方案,不管是前端JS还是后端Python都有对应的实现方式,你可以根据自己的场景选择。

首先先补全你给出的XML示例,方便演示:

<allstops>
  <stop number="2504" name="Main &amp; Bainard EB">
    <location>
      <latitude>42.91033567</latitude>
      <longitude>-81.29671483</longitude>
    </location>
    <routes>28</routes>
  </stop>
  <stop number="20" name="Adelaide &amp; Ada NB">
    <location>
      <latitude>42.891234</latitude>
      <longitude>-81.305678</longitude>
    </location>
    <routes>28, 15</routes>
  </stop>
  <stop number="105" name="King &amp; 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 &amp; Bainard EB">
        <location>
          <latitude>42.91033567</latitude>
          <longitude>-81.29671483</longitude>
        </location>
        <routes>28</routes>
      </stop>
      <stop number="20" name="Adelaide &amp; Ada NB">
        <location>
          <latitude>42.891234</latitude>
          <longitude>-81.305678</longitude>
        </location>
        <routes>28, 15</routes>
      </stop>
      <stop number="105" name="King &amp; 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:34:25