在我看來,使用當前的1.0規範(邁克爾的要求XSLT 2.0及以上),最好的辦法是你使用置換組的頭,而不是爲xs:任何通配符。版本1.0將爲您提供更廣泛的互操作性,以實現軟件堆棧的可用性。
不像XS:任何與替換組你需要一個基本類型來錨定它。我建議讓它成爲一個複雜的類型。它可以是一個空的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>
Extended.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(基於擴展。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>
感謝您的輸入!只要深入研究它就會更好地理解「任何」構造。根據我的理解,被驗證的是來自另一個模式的「新」附加元素/內容,是否有可能使用另一個模式驗證整個「較大」結構? – user1330885
我不確定我已經理解了這個問題。驗證元素時,這意味着驗證以該元素爲根的子樹。 –