Yuan Yijun (bbbush) wrote,
Yuan Yijun
bbbush

schema

<root>
<set1>
<node attr1=""/>
</set1>
<set2>
<node/>
</set2>
</root>


这几天想写个 schema 文件用,但是不知道怎么约束属性是否出现
这个 node 节点,想约束只有 set1 中的 node 的 attr1 是 required,其他位置的 attr1 都是 optional,怎么做?

update:
目前的做法,是定义 attributeGroup,然后把除了 attr1 之外的属性放进去;然后将 set1 中的 node 不作为引用,而是新的一个元素(当然也就没法放到 Global 里面);最后在 set1 的 node 中引用 attributeGroup 并定义 attr1,而其他 node 中只引用 attributeGroup。

也许应该定义两个 attributeGroup 的

无论如何,xs:key 定义都需要复制。怎么才能不复制呢,xs:keyref 的语义不同了。

--
新问题:
* xs:string required 需要把默认值写一个在 schema 里面,但是这个默认值是在另一个文件中定义的,怎么办
* xs:unsignedInt required 的取值必须是另一个 xs:unsignedInt required 的取值,怎么设定呢 (用 <xs:key> 和 <xs:keyref> 不过不成功,很奇怪)
* 怎么进一步限定 xs:unsignedInt 的取值范围? (找到了,xs:minInclusive 和 xs:maxExclusive,一共有四个)
* 这里提到了所有的大写字母是 \p{Lu},可是很多源代码使用了 [A-Z]。使用 [A-Z] 在不同的 locale 中含义不同,使用 \p{Lu} 又有可能把不同语种的字符全包括进去:那么只需要 ASCII 的大写怎么办?死活看不懂 tr18 Unicode RE对应的文件应该怎么用 :(
* 要约束这样的情况:
<option c="1" i=""/>
<option c="2" i=""/>
<option c="2" i=""/>
如果 c 相同,那么 i 不可以相同,怎么约束?可以用 xs:key 吗?

update:
看到 referenceGroup 的设定,还有 abstract="true",很有意思。xml schema 就是一个垃圾箱..
上面第二个问题终于解决了,虽然是禁用了 namespace 才做到的。还有呢,就是要注意 <xs:key> 和 <xs:keyref> 可见性,如果 <xs:keyref> 定义的时候,看不到 <xs:key> 的结点也不行。第四个问题,还是返回去用 [A-Z0-9] 了,也许 \d 也可以?第一个问题我猜需要用到 xlink,最后一个问题也许无法解决 T_T


update:
决定把 c 和 i 分成两个层次,这样就不需要特别的约束了。其他问题都不去碰它,因为时间过得有点快,而我的任务总是做不完。
其实还是很郁闷,因为君英大大一句话就把我第一次做 schema 的努力否定了,连编造一个“需要重写太多代码”的理由都不肯。不过,既然我们的文件格式只会用到下一个新版本的时候,不需要用几年,那么格式定得土一点也没关系。不必考虑什么扩展性的话,真的没关系。只怕下一次 minor release 就需要修改数据格式,过去的文件就解析不了,这种事情又不是没有发生过!
Tags: 小东西
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments