在这个话题中,我想问的脑细胞比我自己能提供的要多得多。我想根据真实 XML 实例中使用/未使用的元素(仅限单个命名空间)重构我的 XSD(v1.0)。让我们建立一个小场景:
我只有针对相应模式的有效 XML 文档:
<body>
<h1>Heading 1</h1>
<p>paragraph</p>
<p><bold>bold</bold>paragraph<italic>italic</italic></p>
</body>
XSD 验证:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="body">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element ref="h1"/>
<xs:element ref="h2"/>
<xs:element ref="p"/>
<xs:element ref="span"/>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="h1" type="xs:string"/>
<xs:element name="h2" type="xs:string"/>
<xs:element name="p">
<xs:complexType mixed="true">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="bold"/>
<xs:element ref="italic"/>
<xs:element ref="underline"/>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="span">
<xs:complexType mixed="true">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="bold"/>
<xs:element ref="italic"/>
<xs:element ref="underline"/>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="bold" type="xs:NCName"/>
<xs:element name="italic" type="xs:NCName"/>
<xs:element name="underline" type="xs:NCName"/>
</xs:schema>
在此基础上,我想创建一份报告(通过 XSLT [2.0、3.0 通过 SAXON EE 9.6.0.5 可用])关于哪些元素(标签 + 属性)不是使用但在我的 XSD 中可能使用。
简化的伪待办事项/从头开始:
- 在我的 XSD 中搜索所有
//xs:element[@name]
(属性跟随在报告 v2.0 中)。 *
在我的 XML 中搜索所有内容- “比较”它
问题:
在可爱的 XSLT 社区中,关于这个主题是否已经超出了我的视野?
如何以良好的方式存储和比较它?
xsl:map
通过 XSLT 3.0使用?存储路径 [ /body/h1
, /body/p
] 并比较这些路径?(棘手:从模式中获取正确的路径,处理所有定义方式,例如xs:group ref="..."
或通过complexTypes
等)
[插件:也许我必须将它扩展到我的 XML 中祖先元素的上下文。在示例情况下,我可能想区分//p/underline
和//span/underline
。]
<xsl:message>please write your thoughts open minded. I don't request for fully functional code!</xsl:message>