使用 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/Namespace 在 dummy 好]
在这种情况下,MarkLogic 发现你很顽皮,拒绝做任何假设。.如果你声明了一个 schemLocation,然后那个位置没有 xsd,MarkLogic 不会倒下回到自己寻找一个。另外,当它发现你的行为有点愚蠢时,它会称你为傻瓜作为回应。 好吧,傻瓜这个词可能有更多的技术原因,但是我喜欢我的描述。
请注意,此模式位置是模式数据库中的模式 URI,而不是网络上的 URI。因此,请确保以适当的 URI 将模式加载到数据库中。避免模式位置的相对 URI 是个好主意——并不是说它们不能工作,而是因为您通常最终会相对于您所想的以外的东西来解析它们,并且如果模式没有在您所在的位置解析说,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.xsdxsi: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/Namespace 在 dummy 好]
在这种情况下,MarkLogic 发现你很顽皮,拒绝做任何假设。.如果你声明了一个 schemLocation,然后那个位置没有 xsd,MarkLogic 不会倒下回到自己寻找一个。另外,当它发现你的行为有点愚蠢时,它会称你为傻瓜作为回应。 好吧,傻瓜这个词可能有更多的技术原因,但是我喜欢我的描述。
请注意,此模式位置是模式数据库中的模式 URI,而不是网络上的 URI。因此,请确保以适当的 URI 将模式加载到数据库中。避免模式位置的相对 URI 是个好主意——并不是说它们不能工作,而是因为您通常最终会相对于您所想的以外的东西来解析它们,并且如果模式没有在您所在的位置解析说,MarkLogic 将回退到使用它可以为该命名空间找到的任何模式。