如何定义允许 base64 内容或 xop:Include 元素的 XML 架构元素?

mek*_*363 5 base64 xsd xop

我有一个 XML 架构,它定义了一个元素,该元素可以是 base64 文本,也可以是 xop:Include 元素。目前,这被定义为 base64Binary 类型:

<xs:element name="PackageBinary" type="xs:base64Binary" minOccurs="1" maxOccurs="1"/>
Run Code Online (Sandbox Code Playgroud)

当我插入 xop:Include 元素时,它看起来像这样:

<PackageBinary>
    <xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="http://google.com/data.bin" />
</PackageBinary>
Run Code Online (Sandbox Code Playgroud)

但这会产生 XML 验证错误(我正在使用 .NET 验证器):

元素“mds:xml-schema:soap11:PackageBinary”不能包含子元素“ http://www.w3.org/2004/08/xop/include:Include ”,因为父元素的内容模型仅为文本。

这是有道理的,因为它不是 base64 内容,但我认为这是常见的做法......?有什么方法可以在架构中支持这一点吗?(我们有支持此语法的现有产品,但我们现在正在添加验证。)

mek*_*363 1

我能想到的最好办法是创建一个允许任何标签的复杂类型,但也被标记为“混合”,因此它允许文本。这并没有显式地将内容声明为 base64,但确实让它通过了验证。

<xs:complexType name="PackageBinaryInner" mixed="true">
  <xs:sequence>
    <xs:any minOccurs="0" maxOccurs="1"/>
  </xs:sequence>
</xs:complexType>
<xs:element name="PackageBinary" type="PackageBinaryInner" minOccurs="1" maxOccurs="1"/>
Run Code Online (Sandbox Code Playgroud)