xsltproc转换XML为GeoJSON提取gen:value报命名空间前缀错误
报错根因
触发Undefined namespace prefix错误的核心原因有两个,同时附带取值逻辑的bug:
- XSLT文件的根节点
xsl:stylesheet未声明gen前缀对应的命名空间,XPath引擎解析带gen:前缀的节点路径时,找不到对应的命名空间映射直接报错。 - 取值路径不符合XML结构:
gen:value不是bldg:Building的直接子节点,且源文件中存在多个gen:value节点,原写法既无法正确定位节点,还会取到无关属性值。 - 原处理
gen:stringAttribute的模板漏传了z参数,会导致输出GeoJSON的高度字段为空。
修复方案
- 在
xsl:stylesheet标签中补充gen命名空间声明,取值必须和源XML中gen前缀绑定的URI完全一致:xmlns:gen="http://www.opengis.net/citygml/generics/2.0" - 修正匹配规则和取值路径,精准定位name为「建物ID」的属性节点下的值,同时补上漏传的
z参数,修改后的对应模板代码如下:<xsl:template match="bldg:Building[gen:stringAttribute[@name='建物ID']]"> <xsl:apply-templates select="bldg:lod0RoofEdge//gml:Polygon"> <xsl:with-param name="z" select="number(bldg:measuredHeight)" /> <xsl:with-param name="id" select="gen:stringAttribute[@name='建物ID']/gen:value" /> </xsl:apply-templates> </xsl:template>
执行验证
修改完成后重新运行原转换命令即可正常执行,输出的GeoJSON中buildingId字段会正确取到22203-bldg-562值:
xsltproc style.xsl 52383622_bldg_6697_op.gml > index.geojson
内容的提问来源于stack exchange,提问作者rio0810
相关产品推荐
相关产品推荐

