【问题标题】:xsd <any/> different result in marklogicxsd <any/> 不同的结果导致 marklogic
【发布时间】:2016-05-31 11:13:44
【问题描述】:

XML:

<?xml version="1.0"?>
<note
xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body xml:lang="en"><div></div></body>
</note>

XSD:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
    <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd">
    </xs:import>
    <xs:element name="note">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="to" type="xs:string"/>
                <xs:element name="from" type="xs:string"/>
                <xs:element name="heading" type="xs:string"/>
                <xs:element name="body">
                    <xs:complexType mixed="true">
                        <xs:complexContent>
                            <xs:extension base="someType">
                                <xs:attribute ref="xml:lang" use="required">
                                </xs:attribute>
                            </xs:extension>
                        </xs:complexContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="someType" mixed="true">
        <xs:sequence>
            <xs:any maxOccurs="unbounded" minOccurs="1" processContents="skip"/>
        </xs:sequence>  
    </xs:complexType>

</xs:schema>

检查this 并且它有效。 但这在 Marklogic 中不起作用,错误是:

XDMP-VALIDATEMISSINGELT: (err:XQDY0027) validate lax { $node } -- Missing required elements: Expected ((any(skip,!())+),(any(skip,!())+)) at fn:doc("d:/xml.xml")/*:note/*:body using schema "/schemas/xsd.xsd"

我的意图是在正文中强制出现 HTML 内容,如下所示:

<body xml:lang="en"><div></div></body>

【问题讨论】:

    标签: xquery marklogic marklogic-8


    【解决方案1】:

    在 MarkLogic 模式解析中似乎存在一个错误,其中 complexType 被标记为“混合”并且还具有扩展名。

    如果您要扩展另一种混合类型,则第一个“混合”是多余的,因此关闭此选项后,一切都会按您的预期工作。

    所以你应该尝试使用架构:

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"    targetNamespace="http://www.w3schools.com"    xmlns="http://www.w3schools.com"    elementFormDefault="qualified">
      <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd">
      </xs:import>
      <xs:element name="note">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="to" type="xs:string"/>
            <xs:element name="from" type="xs:string"/>
            <xs:element name="heading" type="xs:string"/>
            <xs:element name="body">
              <xs:complexType>
                <xs:complexContent>
                  <xs:extension base="someType">
                    <xs:attribute ref="xml:lang" use="required">
                    </xs:attribute>
                  </xs:extension>
                </xs:complexContent>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:complexType name="someType" mixed="true">
        <xs:sequence>
          <xs:any maxOccurs="unbounded" minOccurs="1" processContents="skip"/>
        </xs:sequence>
      </xs:complexType>
    </xs:schema>
    

    【讨论】:

      【解决方案2】:

      在深入挖掘之前,我只想澄清一点——你的模式在哪里?

      MarkLogic 希望模式存在于特定内容数据库的配置中引用的模式数据库中。这默认为 Schemas 数据库。

      您是否将所有引用的 Scemas 都包含在内(通过 XML 或 XSD 到 Schemas 数据库中?)

      在此处查看详细信息,包括 MarkLogic 解析架构的顺序和位置:https://docs.marklogic.com/guide/admin/schemas

      最后,当开始探索 MarkLogic 中的模式使用时,请注意,在更改模式时重新启动 MarkLogic 是个好主意。从技术上讲,您不需要重新启动,实际上只是清除一些缓存,但如果可以重新启动,那么这会让您更快地到达那里并降低学习曲线。

      【讨论】:

      • 是的,我的 xsd 在 Schema 数据库中。我需要添加架构检查,在
        some_text
        中强制出现 html 内容,在上面的代码中同样有效,但失败了在 Marklogic 中,说错误 XDMP-VALIDATEMISSINGELT: (err:XQDY0027) validate lax { $node } -- 缺少必需的元素:预期 (any(skip,!())*,any(skip,!())+)。
      • 我已经编辑了问题以获得准确的信息,只需在免费格式化程序上使用验证检查此示例,但是当我加载到 marklogic 时,它不起作用。 --> xquery 版本“1.0-ml”;让 $node := xdmp:document-get("d:/xml.xml") return try { xdmp:document-insert("myxml/xml.xml", validate lax { $node } ) } catch ($e) { "验证失败:", $e/error:format-string/text() }
      猜你喜欢
      • 2013-08-12
      • 2023-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多