如何修改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,可分两步操作:
- 用原XPath语句筛选出符合条件的way和node节点;
- 遍历每个选中的节点,删除所有非tag类型的子节点,仅保留tag元素。
内容的提问来源于stack exchange,提问作者DaveF
相关产品推荐
相关产品推荐

