我开始认为这很简单,但我被困了:
我想基于公开的XSD编写/读取XML文件,其中包含一些我想在自己的XSD中定义的额外元素。 XML主要应该如下所示:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<PublicRoot xmlns="http://public.com/PublicSchema" xmlns:own="http://myown.com/OwnSchema">
<PublicA>
<PublicB PublicAttrib1="1">
<!-- I only want own:OwnA to validate OK here, inside the PublicB element: -->
<own:OwnA OwnAttrib1="My own attribute" />
</PublicB>
<own:OwnA OwnAttrib1="My own attribute" /> <!-- Should FAIL validation -->
</PublicA>
<own:OwnA OwnAttrib1="My own attribute" /> <!-- Should FAIL validation -->
</PublicRoot>
当然,公共模式允许来自其元素内的其他模式的额外元素 - 以下是PublicSchema中所有元素的一部分:
<xs:any namespace="##other" processContents="lax" minOccurs="0"/>
这意味着除了PublicSchema XSD之外,上面的XML示例使用以下OwnSchema XSD完全验证:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
targetNamespace="http://myown.com/OwnSchema"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="OwnA">
<xs:complexType>
<xs:attribute name="OwnAttrib1" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:schema>
我的问题是,我想创建一个不验证正确格式化的Own元素的XSD,该元素放置在Public节点树中的其他位置,而不是我想要的(在上面的例子中,只有own:OwnA元素)作为PublicB元素的子元素放置应该是有效的。)
我考虑过重新定义或扩展PublicB元素的类型,但这似乎意味着篡改PublicSchema,我不应该触及。
我是在尝试做一些不合逻辑或不可能的事情,还是可以解决这个问题?