0

假设我们有一个样式表,它使用 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 而不是限制/枚举。这是因为使用限制/枚举将需要制作一个单独的有效类型属性列表。

但是,看起来 key/keyref 并不会真正起作用。尝试过(使用 MSXML 6.0)后,模式键的选择器似乎不会接受其 xpath 参数中的 document() 函数,因此我们无法检查项目元数据,无论它是否出现在外部文件中或在架构文件本身中。看起来我们唯一可以查找键的地方是实例文档。

所以如果我们真的不想有一个单独的有效类型列表,我们必须做一个预验证转换,拉入 item-meta 的东西,然后做验证,然后做我们原来的转换。对于应该相对直接地使用 XML 模式和样式表来说,这似乎过于复杂了。

有没有更好的办法?

4

3 回答 3

1

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

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

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

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

于 2008-09-22T20:30:25.153 回答
0

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

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

于 2008-09-22T21:41:30.270 回答
0

您不需要因为一些错误而停止 XSLT。让它产生一些架构不会验证的东西,并且指向原来的问题,比如

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

除此之外,请记住这里没有讨论线程。这些帖子可能会上下波动,因此最好相应地编辑您的问题。

请记住,这里的理念是“一个问题,最佳答案获胜”。

于 2008-09-22T21:54:01.877 回答