在我看来,使用当前 1.0 规范(Michael 要求 XSLT 2.0 及更高版本)的最佳方法是使用替换组的头部而不是 xs:any 通配符。版本 1.0 将为您提供更广泛的互操作性与软件堆栈的可用性。
与 xs:any 不同,对于替换组,您需要使用基本类型来锚定它。我建议将其设为复杂类型。它可以是一个空的 complexType 定义,这样它就不会携带任何“多余”的包袱。
然后,验证将只是将解析器指向包含替换组成员的模式,而不是基本模式。
更新:添加示例 XSD 来说明;你的更新为 SubstitutionGroupExample.xsd:
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="AType">
<xs:sequence>
<xs:element name="B"/>
<xs:element ref="any" />
</xs:sequence>
</xs:complexType>
<xs:element name="A" type="AType"/>
<xs:complexType name="TAny" abstract="true"/>
<xs:element name="any" type="TAny" abstract="true"/>
</xs:schema>
扩展的.xsd:
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd/1" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd/1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:base="http://tempuri.org/XMLSchema.xsd">
<xs:import namespace="http://tempuri.org/XMLSchema.xsd" schemaLocation="SubstitutionGroupExample.xsd"/>
<xs:element name="someAny" substitutionGroup="base:any">
<xs:complexType>
<xs:complexContent>
<xs:extension base="base:TAny">
<xs:sequence>
<xs:element name="new"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:schema>
一个有效的 XML(基于 Extended.xsd):
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:ext="http://tempuri.org/XMLSchema.xsd/1">
<B>anyType</B>
<ext:someAny>
<ext:new/>
</ext:someAny>
</A>