我们正在构建一个XQuery工具来为XSD Schemas(特别是UBL 2.1 Schema)创建文档。
为了做到这一点,我们需要简化使用元素引用和复杂类型构建的模式,使其成为内联定义。
所以像这样的元素:
<xsd:element name="Order" type="OrderType"/>
<xsd:complexType name="OrderType">
<xsd:sequence>
...
<xsd:element ref="cbc:UBLVersionID" minOccurs="0" maxOccurs="1"/>
...
</xsd:sequence>
</xsd:complexType>
...
(in another file)
<xsd:element name="UBLVersionID" type="UBLVersionIDType"/>
<xsd:complexType name="UBLVersionIDType">
<xsd:simpleContent>
<xsd:extension base="xsd:string"/>
</xsd:simpleContent>
</xsd:complexType>
应转换为:
<xsd:element name="Order">
<xsd:complexType>
<xsd:sequence>
...
<xsd:element ref="cbc:UBLVersionID" minOccurs="0" maxOccurs="1">
<xsd:complexType name="UBLVersionIDType">
<xsd:simpleContent>
<xsd:extension base="xsd:string"/>
</xsd:simpleContent>
</xsd:complexType>
...
</xsd:sequence>
</xsd:complexType> </xsd:element>
考虑到导入的模式中定义了一些元素和类型。
有没有一种已知的方法来使用XQuery获取此功能?
感谢。
答案 0 :(得分:1)
您可能会发现将模式处理成Saxon的SCM格式很有用,它本质上是标准化形式的XSD架构组件的XML表示形式。您可以使用
生成此表单java com.saxonica.Validate -xsd:schema.xsd -scmout:schema.scm
SCM格式的文档基本上是W3C规范中的模式组件文档。
格式与您要求的格式相反:所有组件都是&#34;不在线&#34;,通过以下引用访问。但它非常统一,并且避免了管理包含,导入,命名空间和QNames的所有复杂性。
答案 1 :(得分:0)
我不知道&#34;已知的方法&#34;,我认为你的意思是开箱即用或预先构建的东西。
您实际上需要编写自定义转换,您可以在XQuery或XSLT中执行此操作。在XQuery中,这基本上是一个递归下降,您可以在这里找到示例:https://en.wikibooks.org/wiki/XQuery/Transformation_idioms
然而,正如@ michael-kay指出的那样,您还必须编写代码来处理导入和包含。因此,首先对SCM格式进行预处理(在进行内联之前)是一个好主意,当然您还需要编写一个转换来从SCM返回到模式......