使用Marklogic时对XML架构进行版本控制

使用Marklogic时对XML架构进行版本控制,marklogic,Marklogic,我在其他地方读到过,在XML模式的url中使用版本字符串通常是不好的做法——原因我理解 我想知道当使用marklogicdb时,这个咒语是否仍然适用?我的理由是名称空间和存储的XML对象在Marklogic中似乎紧密相连。通常推荐的在XML内容中存储版本的方法在这种情况下似乎不太有用,因为您希望DB引擎了解要使用哪个XSD架构版本。这向我表明,与流行的观点相反,名称空间中的版本字符串可能是一种更好的方法 当前版本的XSD中没有版本,但我们还需要在导入现有XML文档并开始工作后的几个月内创建一个增

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

我想知道当使用
marklogicdb
时,这个咒语是否仍然适用?我的理由是名称空间和存储的XML对象在
Marklogic
中似乎紧密相连。通常推荐的在XML内容中存储版本的方法在这种情况下似乎不太有用,因为您希望DB引擎了解要使用哪个XSD架构版本。这向我表明,与流行的观点相反,名称空间中的版本字符串可能是一种更好的方法

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


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

另一种解释版本控制的方法是使用
xsi:schemaLocation
来说明通过物理位置使用的模式版本

架构数据库:

/模式/版本/1.0/A.xsd
/schemas/versions/2.0/A.xsd

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

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

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

=========================================================================
编辑:要展开Mary的评论,上面的示例基于schemas数据库,还显示了完整路径。我没有这样说。但是,就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将导入与导入的模式相关的其他两个schemaLocation

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

加载到schemas数据库中的架构的目标命名空间为

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

schemaLocation设置为版本4的示例:

布拉布拉
/sc:schema()
结果:[164,at/schemas/v4/A.xsdok]

schemaLocation设置为版本3的示例:

布拉布拉
/sc:schema()
结果:[164,at/schemas/v3/A.xsd正常]

模式位置未设置的示例:

布拉布拉
/sc:schema()
结果:[164,at/schemas/v3/A.xsd正常] 在这种情况下,MarkLogic做出了选择

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

布拉布拉
/sc:schema()
结果:[108,在<强>假人<强>正常]


在这种情况下,MarkLogic发现你非常淘气,拒绝做出任何假设。。如果您声明了一个schemLocation,但该位置没有xsd,那么MarkLogic将不会退回到自己查找xsd的方式。。另外,当它发现你的行为有点愚蠢时,它会称你为傻瓜。。好。。dummy这个词可能有更技术性的原因,但我喜欢我的描述。

注意,这个模式位置是模式数据库中模式的URI,而不是web上的URI。因此,请确保以适当的URI将模式加载到数据库中。避免模式位置的相对URI是一个好主意,这并不是因为它们不能工作,而是因为您经常会根据您所认为的以外的内容来解析它们,如果模式没有在您所说的位置解析,MarkLogic将返回使用它能为该命名空间找到的任何模式

谢谢你的回答-需要重新阅读和实验,但我想我明白了。schemaLocation提供了一个可解析为ML模式d/b的路径,而不是使用URI来定位它。我猜接下来的问题是——我是否有可能在某个地方看到/诊断实际正在发现/解决的模式——因此我可以确定何时我找到了正确的模式?我已经更新了原始答案,并回答了您的问题。这就是如何检查正在加载架构的任何文档。此外,如果您使用xdmp:validate,但出现故障,则架构位置是大量错误消息信息的一部分。太好了,谢谢。实际上,我在那里非常懒惰——经过一番挖掘,我发现了一整本手册中关于XML模式的部分。我不喜欢只发帖子而不看。不管怎样,好消息是手册部分和你们这里的rposts已经帮助我在头脑中明白了,非常感谢。没问题。。如果答案匹配,请将其标记为已接受答案。这有助于保持stackoverflow干净有序
<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()
<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()
<document
xmlns="http://my/A/Namespace"
>
<something>Bla Bla</something>
</document>/sc:schema()
<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()