使用 Marklogic 时的版本控制 XML 模式

Versioning XML schemas when working with Marklogic

我在其他地方读到,在 XML 模式的 URLs 中使用版本字符串通常是不好的做法 - 对于我理解的原因。

我想知道在使用 Marklogic DB 时这个咒语是否仍然适用?我的原因是命名空间和存储的 XML 对象在 Marklogic 中似乎联系非常紧密。通常推荐的将版本存储在 XML 内容中的方法在这种情况下似乎不太有用,因为您需要 DB 引擎了解要使用哪个 XSD 架构版本。这对我来说表明,与流行的智慧相反,命名空间中的版本字符串可能是更好的方法。

我们 XSD 的当前版本中没有任何版本,但我们还需要在几个月后创建一个增强版本现有 XML 文档已导入并正常工作

编辑 - 如果不是很明显,我是 Marklogic 新手!

另一种解释版本控制的方法是使用 xsi:schemaLocation 通过物理位置说明使用哪个版本的架构。

Schemas Database:

/schemas/versions/1.0/A.xsd
/schemas/versions/2.0/A.xsd

xsi:schemaLocation="http://www.example.com/schemas/A /schemas/versions/1.0/A.xsd"

and

xsi:schemaLocation="http://www.example.com/schemas/A /schemas/versions/2.0/A.xsd"

这样,MarkLogic 将使用 schemaLocation 中定义的 xsd 进行索引和验证,例如。

============================================= ============
编辑: 为了扩展 Mary 的评论,上面的示例基于模式数据库,还显示了完整路径。我没有这么说。但只要 schemaLocation 是一个完整路径,在某些情况下,您也可能只需要导入一个架构。

以作为包发布的模式为例:

/schemas/versions/3.0/A.xsd
/schemas/versions/3.0/common/something.xsd
/schemas/versions/3.0/common/something-else.xsd

假设 A.xsd 在 ./common/something.xsd
的导入语句中 something.xsd 有 ./something-else.xsd

的导入语句

在这种情况下,可以只使用为 /schemas/versions/3.0/A.xsd 定义的 schemaLocation,因为 MarkLogic 将相对于导入的模式导入另外两个。

============================================= ============
编辑 2: 已提出另一个问题。使用 SchemaLocation 时,如何在 MarkLogic 中判断正在使用哪个模式。答案是 sc:xxxx 函数。最基本的是xs:schema。在其他一些有趣的事情中,它会在解析时告诉您模式和该模式的位置。使用的函数可以用于任何元素。我只是在以下示例中使用文档本身:

加载到目标命名空间为 http://my/A/Namespace 的模式数据库中的模式:

/schemas/v3/A.xsd
/schemas/v4/A.xsd

schemaLocation 设置为版本 4 的示例:

<document
xmlns="http://my/A/Namespace"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://my/A/Namespace /schemas/v4/A.xsd"
>
<something>Bla Bla</something>
</document>/sc:schema()

结果:[164,,http://my/A/Namespace/schemas/v4/A。xsd 好]

schemaLocation 设置为版本 3 的示例:

<document
xmlns="http://my/A/Namespace"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://my/A/Namespace /schemas/v3/A.xsd"
>
<something>Bla Bla</something>
</document>/sc:schema()

结果:[164,,http://my/A/Namespace/schemas/v3/A。xsd 好的]

schemaLocation 为 NOT SET 的示例:

<document
xmlns="http://my/A/Namespace"
>
<something>Bla Bla</something>
</document>/sc:schema()

结果:[164,,http://my/A/Namespace/schemas/v3/A。xsd 好] 在这种情况下,MarkLogic 做出了选择...

schemaLocation 设置为 不存在的版本的示例:

<document
xmlns="http://my/A/Namespace"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://my/A/Namespace /schemas/v9999/A.xsd"
>
<something>Bla Bla</something>
</document>/sc:schema()

结果:[108,,http://my/A/Namespacedummy 好]

在这种情况下,MarkLogic 发现你很顽皮,拒绝做任何假设。.如果你声明了一个 schemLocation,然后那个位置没有 xsd,MarkLogic 不会倒下回到自己寻找一个。另外,当它发现你的行为有点愚蠢时,它会称你为傻瓜作为回应。 好吧,傻瓜这个词可能有更多的技术原因,但是我喜欢我的描述。

请注意,此模式位置是模式数据库中的模式 URI,而不是网络上的 URI。因此,请确保以适当的 URI 将模式加载到数据库中。避免模​​式位置的相对 URI 是个好主意——并不是说它们不能工作,而是因为您通常最终会相对于您所想的以外的东西来解析它们,并且如果模式没有在您所在的位置解析说,MarkLogic 将回退到使用它可以为该命名空间找到的任何模式。