如何获取XSD文件中元素的完整层级结构(含继承关系)?
针对S100 GML XSD生成元素层级树形图的最优方案
你需要从IHO S100的两个XSD文件中,生成仅包含可实例化元素的层级路径树形结构,排除抽象类、枚举等非实例化内容,同时完整应用extension/sequence定义的继承关系。以下是三个可落地的最优方案:
一、优化Enterprise Architect(EA)的导入与过滤
既然你已有EA授权,优先调整EA配置来满足需求:
- 精准导入XSD:
- 启动EA的XSD导入向导,在「选项」步骤中取消勾选「抽象类」「枚举类型」「非元素引用的简单类型」,仅保留「可实例化元素」「非抽象复杂类型」的导入选项;
- 导入时勾选「解析继承关系」,让EA自动展开
extension定义的子元素层级。
- 生成并清理层级视图:
- 在EA模型浏览器中找到导入的根元素(如示例中的
<geometry>),右键选择「显示派生层次」→「完整路径」; - 若仍有无关节点,用EA搜索功能筛选所有标记为「抽象」的元素,批量隐藏或删除,仅保留可实例化节点。
- 在EA模型浏览器中找到导入的根元素(如示例中的
- 导出树形结构:
- 将清理后的视图导出为「树形图」格式,或直接复制节点结构为Markdown列表。
二、自定义XSLT转换生成精准树形结构
利用XSD的XML特性,编写XSLT脚本精准过滤并展开元素层级,完全可控:
- 编写XSLT核心逻辑:
- 匹配所有
xsd:element节点,排除abstract="true"的抽象元素; - 递归遍历
xsd:extension和xsd:sequence,展开父类型的子元素,生成完整实例化路径; - 输出为Markdown树形列表或SVG图表。以下是简化版XSLT示例(可根据S100命名空间调整):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:s100="https://schemas.s100dev.net/schemas/S100/5.0.0/S100GML/20220620"> <xsl:output method="text" encoding="UTF-8"/> <!-- 处理根元素 --> <xsl:template match="/xsd:schema"> <xsl:apply-templates select="xsd:element[not(@abstract='true')]"/> </xsl:template> <!-- 递归展开元素层级,添加缩进 --> <xsl:template match="xsd:element"> <xsl:param name="indent" select="''"/> <xsl:value-of select="concat($indent, '- ', @name, ' ')"/> <!-- 展开当前元素的子元素(包括继承的extension) --> <xsl:apply-templates select="xsd:complexType/xsd:sequence/xsd:element | xsd:complexType/xsd:extension/xsd:sequence/xsd:element"> <xsl:with-param name="indent" select="concat($indent, ' ')"/> </xsl:apply-templates> </xsl:template> </xsl:stylesheet> - 匹配所有
- 执行转换:
- 使用XML工具(如Saxon、XMLSpy)加载XSD和XSLT脚本,执行转换后即可得到纯元素层级的树形文本。
三、使用GIS专用XSD可视化工具
针对OGC/GML标准优化的工具,无需复杂配置即可满足需求:
- Geoserver Schema Viewer:专门支持OGC标准XSD解析,加载S100 XSD后可一键过滤抽象元素、枚举,自动展开继承的元素层级,直接生成可视化树形图;
- XMLSpy:专业XML工具,在「Schema View」中配置过滤规则,隐藏抽象类、枚举,展开所有派生元素的完整路径,可导出为图像或文本格式。
内容的提问来源于stack exchange,提问作者milad moradi
相关产品推荐
相关产品推荐

