我的(也许是修辞)问题是,如果每个 XML 与模型的关系是静态的,为什么有人希望看到这个元数据?
我将向您展示一个 UBL XSD 片段(XML 命名空间被忽略为不相关):
<xsd:element ref="cbc:UBLVersionID" minOccurs="0" maxOccurs="1">
<xsd:annotation>
<xsd:documentation>
<ccts:Component>
<ccts:ComponentType>BBIE</ccts:ComponentType>
<ccts:DictionaryEntryName>Application Response. UBL Version Identifier. Identifier</ccts:DictionaryEntryName>
<ccts:Definition>The earliest version of the UBL 2 schema for this document type that defines all of the elements that might be encountered in the current instance.</ccts:Definition>
<ccts:Cardinality>0..1</ccts:Cardinality>
<ccts:ObjectClass>Application Response</ccts:ObjectClass>
<ccts:PropertyTerm>UBL Version Identifier</ccts:PropertyTerm>
<ccts:RepresentationTerm>Identifier</ccts:RepresentationTerm>
<ccts:DataType>Identifier. Type</ccts:DataType>
<ccts:Examples>2.0.5</ccts:Examples>
</ccts:Component>
</xsd:documentation>
</xsd:annotation>
</xsd:element>
您可以在这里看到有很多结构化数据可以很容易地作为与您的问题相关的内容传递。但从根本上说,这是一种使用 XSD 注释机制的机制,以实现与 XSD 相关的事情。另一种是 JAXB 自定义绑定机制使用的:
<xsd:simpleType name="ZipCodeType">
<xsd:annotation>
<xsd:appinfo>
<jxb:javaType name="int" parseMethod="javax.xml.bind.DatatypeConverter.parseInt" printMethod="javax.xml.bind.DatatypeConverter.printInt"/>
</xsd:appinfo>
</xsd:annotation>
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="10000"/>
<xsd:maxInclusive value="99999"/>
</xsd:restriction>
</xsd:simpleType>
虽然这与 UBL 示例不同(documentation vs. appinfo),但两者都使用 XSD 注释机制。
JAXB 的自定义绑定还支持一个模型,其中自定义绑定与 XSD 分离(在它们自己的单独 XML 文件中)。自定义绑定文件(在您的案例中为元数据)和 XSD(在您的案例中为 XML)之间的关联是通过 XPath 匹配完成的。
这带来了另一个澄清:您想到的处理模型是什么?动态(即元模型是静态的,但可以应用于任意 XSD)?平台?如果它恰好与您的平台相匹配,下面是一个可以以动态方式满足您需要的解决方案。
。网:
以上基本上是将PSVI应用于您的XML。Java 也是如此(在此Xerces 页面上搜索How do I retrieve PSVI from the DOM?
)...
我也可以描绘出 XSLT 的解决方案,或者根本不涉及 XSD……以上内容应该足以让您入门。