【问题标题】:Simplify XSD Schema using XQuery使用 XQuery 简化 XSD 模式
【发布时间】:2014-10-20 20:21:17
【问题描述】:

我们正在构建一个 XQuery 工具来为 XSD 模式(特别是 UBL 2.1 模式)创建文档。

为了做到这一点,我们需要将大量使用元素引用和复杂类型构建的模式简化为内联定义。

所以像这样的元素:

   <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 来获得它?

谢谢。

【问题讨论】:

  • 请记住,您显示的目标表单不是合法的 XSD 模式文档。如果输出的唯一消费者是您的文档软件,那么这将不是问题。但是如果你想使用内联('simplified'?不是真的)表单来验证(如果只是为了测试以确保它接受和拒绝与原始文档相同的文档),那些'ref'属性将需要更改为'名称的属性。 (嗯。但是考虑到导入的存在,无论如何您都不能在单个架构文档(xsd:schema 元素)中定义架构。所以也许这不是问题。)
  • 你是对的。我的兴趣是将一组模式文件(在本例中为 UBL)转换为一个完全内联的文件。

标签: xml xsd xquery


【解决方案1】:

您可能会发现将模式处理为 Saxon 的 SCM 格式很有用,该格式本质上是标准化形式的 XSD 模式组件的 XML 表示。您可以使用

生成此表单
java com.saxonica.Validate -xsd:schema.xsd -scmout:schema.scm

SCM 格式的文档基本上是 W3C 规范中的架构组件文档。

格式与您要求的相反:所有组件都“不合时宜”,可通过以下参考访问。但它高度统一,避免了管理包含、导入、命名空间和 QName 的所有复杂性。

【讨论】:

  • 有机会在 Saxon-HE 上看到它吗? (直到我的存钱罐有足够的钱购买完整的撒克逊人);-)
  • Saxon-HE 不包括任何模式处理能力。如果您买不起,请见谅;我们试图让价格实惠,同时仍然带来足够的收入来资助商业和开源产品的开发,但总会有一些人想要一个功能但无法证明成本合理。
【解决方案2】:

我不知道“已知方法”,我认为您的意思是开箱即用或预先构建的东西。

您实际上需要编写一个自定义转换,这可以在 XQuery 或 XSLT 中完成。在 XQuery 中,这基本上是一种递归下降,您可以在此处找到示例:https://en.wikibooks.org/wiki/XQuery/Transformation_idioms

但是正如@michael-kay 指出的那样,您还必须编写代码来处理导入和包含。因此,也许首先对 SCM 格式进行预处理(在您进行内联之前)是一个好主意,当然您还需要编写一个转换以从 SCM 回到架构...

【讨论】:

  • 这是我一直在使用的方法,但我遇到了无限递归的问题。你有什么好的 XQuery 调试器可以推荐吗?
  • 如果您使用的是 Saxon,那么 Oxygen IDE 中内置了一个相当不错的调试器。
  • 查看github.com/lcahlander/xsd2json.git项目中xsd2json.xqy中的函数parse-level()。它处理无限递归问题。
猜你喜欢
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
相关资源
最近更新 更多