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

如何修改XPath仅返回指定子元素且保留树形结构?

XPath筛选并保留树形结构仅返回tag元素

原使用的XPath语句

.selectNodes("(//delete/node|//delete/way)[tag[@k='railway'][@v='station' or @v='platform']]")

原语句返回结果

<delete>
    <way id="48016377">
        <nd ref="610578972"/>
        <sys bic="gb"/>
        <tag k="railway" v="platform"/>
    </way>
    <node id="797115753">
        <nd ref="3035237104"/>
        <nd ref="2473620966"/>
        <nm top="left"/>
        <tag k="electrified" v="contact_line"/>
        <tag k="railway" v="station"/>
    </node>
</delete>

期望输出结构

<delete>
    <way id="48016377">
        <tag k="railway" v="platform"/>
    </way>
    <node id="797115753">
        <tag k="electrified" v="contact_line"/>
        <tag k="railway" v="station"/>
    </node>
</delete>

实现方法

XPath本身只是节点选择工具,无法直接修改XML结构(保留父节点同时只保留指定子节点),需要结合转换逻辑实现:

方法1:使用XSLT转换(推荐)

编写XSLT模板,既筛选符合条件的way/node,又只保留它们的tag子节点:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 保留delete、way、node节点及其属性,仅复制tag子节点 -->
    <xsl:template match="delete | way | node">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:copy-of select="tag"/>
        </xsl:copy>
    </xsl:template>

    <!-- 过滤掉不包含指定railway标签的way和node -->
    <xsl:template match="way[not(tag[@k='railway'][@v='station' or @v='platform'])]"/>
    <xsl:template match="node[not(tag[@k='railway'][@v='station' or @v='platform'])]"/>

    <!-- 忽略其他无关节点和文本 -->
    <xsl:template match="text() | *[not(self::tag)]"/>
</xsl:stylesheet>

方法2:XPath筛选+代码逻辑处理

如果无法使用XSLT,可分两步操作:

  1. 用原XPath语句筛选出符合条件的way和node节点;
  2. 遍历每个选中的节点,删除所有非tag类型的子节点,仅保留tag元素。

内容的提问来源于stack exchange,提问作者DaveF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:25:17