你能在XML模式中使用key / keyref而不是restriction / enumeration吗?

时间:2008-09-22 18:02:04

标签: xsd

假设我们有一个样式表,它使用key()函数提取元数据。换句话说,我们有这样的实例文​​档:

<items>

<item type="some_type"/>

<item type="another_type"/>

</items>

以及我们希望在处理过程中与项目关联的其他数据表:

<item-meta>

<item type="some_type" meta="foo"/>

<item type="another_type" meta="bar"/>

<item type="yet_another_type" meta="baz"/>

</item-meta>

最后,假设我们想要对实例文档进行模式验证,将类型属性限制为item-meta中出现的类型集。所以在模式中我们想要使用key / keyref而不是restrict / enumeration。这是因为使用限制/枚举将需要创建一个单独的有效类型属性列表。

但是,它看起来不像key / keyref实际上会起作用。尝试过它(使用MSXML 6.0),模式键的选择器似乎不接受其xpath参数中的document()函数,因此我们无法检查item-meta数据,无论它是出现在外部文件中还是在模式文件本身。看起来我们可以查找密钥的唯一地方是实例文档。

因此,如果我们真的不希望有一个单独的有效类型列表,我们必须进行预验证转换,拉入item-meta的东西,然后进行验证,然后进行原始转换。对于XML架构和样式表的相对简单的使用,这似乎过于复杂。

有更好的方法吗?

3 个答案:

答案 0 :(得分:1)

key / keyref中的选择器仅允许非常有限的xpath语法。简短但不完全准确:选择器必须指向声明元素的子节点。

受限语法的完整定义是-> here

所以,不,我没有看到更好的方式,抱歉。

BTW:W3C声明这种限制是为了让XML Schema处理器的实现者更轻松。请记住,XML Schema的设计目标之一是使以流模式处理文档成为可能。这解释了XML Schema的许多有时看似随机的限制。

答案 1 :(得分:0)

在考虑了一点之后,我想出了让样式表完成验证的那部分。模式将项类型定义为纯字符串,如果样式表无法在item-meta表中查找项类型,则样式表将发出消息并停止处理。

此解决方案修复了不止一次写下有效类型列表的原始问题,但它引入了验证逻辑现在与样式表逻辑混合的问题。我没有足够的经验使用XSD + XSLT来判断这个新问题是否比旧问题更严重,但它似乎比我之前写的关于将item-meta表拉入每个实例文档中的更优雅。预验证转换。

答案 2 :(得分:0)

您不需要因某些错误而停止XSLT。只是让它产生架构不会验证的东西,并指出原始问题,如

 <error txt="Invalid-Item-Type 'invalid_type'"/>

除此之外,请记住,这里没有讨论主题。帖子可能会上下移动,因此最好相应地修改您的问题。

请记住,这里的哲学是“一个问题,最好的答案获胜”。

相关问题