我们可以使用key / keyref代替XML模式中的限制/枚举吗?
假设我们有一个样式表,它使用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模式和样式表来说,这似乎过于复杂了。
有没有更好的办法?
解决方案
key / keyref中的选择器仅允许非常严格的xpath语法。简短但不完全准确:选择器必须指向声明的元素的子节点。
受限语法的完整定义在此处->。
所以,对不起,我没有更好的方法。
顺便说一句:W3C指出,进行此限制是为了使XML Schema处理器的实现者的工作更加轻松。请记住,XML Schema的设计目标之一是使以流模式处理文档成为可能。这确实解释了XML Schema的许多有时看似随机的限制。
考虑了一下之后,我想到了让样式表执行验证的那一部分的想法。该模式会将项目类型定义为纯字符串,如果样式表无法在item-meta表中查找项目类型,则样式表将发出一条消息并停止处理。
此解决方案解决了必须多次记录有效类型列表的原始问题,但是它引入了验证逻辑现在与样式表逻辑混合在一起的问题。我没有使用XSD + XSLT的经验,无法告诉我们这个新问题是否比旧问题严重,但是它似乎比我之前写的关于将item-meta表拉入一个实例中的每个实例文档的优雅得多。验证前转换。
我们无需因某些错误而停止XSLT。只是让它产生架构无法验证的内容,并指出原始问题,例如
<error txt="Invalid-Item-Type 'invalid_type'"/>
除此之外,请记住,这里没有讨论线程。帖子可能会起伏不定,因此最好相应地编辑问题。
请记住,这里的理念是"一个问题,最好的答案胜出"。