我已经在其他地方读到,在 XML 模式的网址中使用版本字符串通常是不好的做法 - 出于我理解的原因。
我想知道在使用Marklogic DB
时这个咒语是否仍然适用?我的理由是名称空间和存储的 XML 对象在Marklogic
中看起来非常紧密。在这种情况下,通常建议的将版本存储在 XML 内容中的方法可能不太有用,您希望 DB 引擎了解 XSD 要使用的架构版本。这告诉我,与流行的智慧相反,命名空间中的版本字符串可能是更好的方法。
我们 XSD 的当前版本中没有版本,但是一旦我们拥有现有的 XML 导入和工作的文件
编辑 - 如果不是很明显,我是Marklogic的新手!
答案 0 :(得分:4)
考虑版本控制的另一种方法是使用xsi:schemaLocation
来说明通过物理位置使用哪个版本的架构。
架构数据库:
/模式/版本/的 1.0 强> /A.xsd
/模式/版本/的 2.0 强> /A.xsdxsi: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的评论,上面的示例基于模式数据库,并显示完整路径。我没有说明。但是,就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如何告诉您正在使用WHICH模式。答案是sc:xxxx函数。最基本的是xs:schema。在其他漂亮的东西中,它将告诉您该模式的架构和位置,因为它解决了它。使用的函数可用于任何元素。我只是在以下示例中使用文档本身:
加载到模式数据库中的模式,其目标名称空间为 http://my/A/Namespace :
/schemas/v3/A.xsd
/schemas/v4/A.xsd
<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 ok]
<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 ok]
<document
xmlns="http://my/A/Namespace"
>
<something>Bla Bla</something>
</document>/sc:schema()
结果:[164 ,, http://my/A/Namespace位于 /schemas/v3/A.xsd 确定] 在本案例中,MarkLogic做出了选择......
<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/Namespace在虚拟确定]
在这种情况下,MarkLogic发现你很顽皮并且拒绝做出任何假设。如果你声明一个schemLocation然后在那个位置没有xsd,MarkLogic就不会再回头找它了。另外,因为它发现你的行为有点傻,它会回应你,称你为假人。嗯..假人可能有更多的技术原因,但我喜欢我的描述。
答案 1 :(得分:3)
请注意,此架构位置是架构数据库中架构的URI,而不是Web上的架构的URI。因此,请确保将模式加载到适当URI的数据库中。避免模式位置的相对URI是一个好主意 - 不是因为它们无法工作,而是因为你经常最终解决它们而不是你想到的东西,并且如果模式没有在你所在的地方得到解决他说,MarkLogic将回归使用它可以为该命名空间找到的任何模式。