使用XQuery简化XSD架构

时间:2014-10-20 20:21:18

标签: xml xsd xquery

我们正在构建一个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获取此功能?

感谢。

2 个答案:

答案 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返回到模式......