【发布时间】:2011-04-13 21:46:23
【问题描述】:
我正在寻找一种方法(如果可能的话)使用 XSD 文档的 XSL 转换来删除未使用的元素。这在我的工作中经常出现,公司会定义一个包含绝对所有内容的 XSD,但随后他们会希望为其中的单个根元素创建一个缩减版本。
为了进一步解释,我可能有一个如下所示的 XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="RootElement">
<xs:complexType>
<xs:sequence>
<xs:element ref="ChildElement"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ChildElement"/>
<xs:element name="UnusedElement"/>
</xs:schema>
我希望能够设置一个 XSL,在其中提供起始元素(在本例中为 RootElement),它将复制所有相关元素但忽略未使用的元素。在上面的示例中,如果我传入 RootElement,我希望看到 RootElement 和 ChildElement 包含但 UnusedElement 省略。
(当我说“提供起始元素”时,我很高兴打开样式表并在需要的地方输入xsl:template match="RootElement"。)
这显然必须是递归的,因此将导航定义在起始元素下方的整个结构,并且该架构中未使用的任何元素都将被丢弃。
(当然,如果它可以在任何导入的模式中做同样的事情会更好!)
我在 Google 上进行了广泛的搜索,但在这方面找不到任何东西 - 我不确定这是否意味着不可能。
谢谢!
编辑:实际上我可能应该澄清并说我想删除未使用的元素和类型,因此它将遵循ref="childElement" 和type="someType" 链接。
【问题讨论】:
-
好问题,+1。请参阅我的答案以获得完整的解决方案。
-
谢谢迪米特。您的解决方案很接近(请参阅下面的我的 cmets),但它仍然存在一些问题(条带类型定义,不跨越导入的模式)。可能我的示例 XML 被过度简化了。对于声明性语言,这实际上可能不是一个可解决的问题,或者至少不值得努力告诉 XSLT 如何 去做。但是,除非在接下来的一两天内出现意外情况,否则我会将您的回复标记为(最接近的)答案。谢谢!