[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]
Subject: Including a schema more than once without causing errors
Folks, 1. Problem One of the problems about RELAX NG is "Double inclusion". When a schema is included more than once, we have compile errors. This is because each named pattern in the doubly included schema is doubly defined. http://lists.oasis-open.org/archives/relax-ng-comment/200407/msg00007.html) I am interested in this problem again, since the RELAX NG schemas for OOXML (which are provided as part of the OOXML DIS) do not work for this reason. 2. Walkaround in RNG 1.0 A walkaround is to specify the combine attribute everywhere. http://lists.oasis-open.org/archives/relax-ng-comment/200407/msg00007.html But this walkaround makes it impossible to detect unintended name collision. Moreover, it hampers conversion to W3C XML Schema. http://relaxng.org/pipermail/relaxng-user/2004-November/000594.html Another walkaround (which is suggested by the above mail) is to "de-include" schema modules and create a monolithic RNC file. A minor revision to this walkaround is to generate a sequence of include statements for the required modules, store the the sequence in a new RNG schema, and get rid of all in-line include statements from the existing modules. 3. Future extensions of RELAX NG Although walkarounds might work, extensions of the RELAX NG language are preferable as a long term solution. One proposal from John Cowan is to allow multiple definitions without the combine attribute only when the right-hand side of the multiple definitions are identical. http://relaxng.org/pipermail/relaxng-user/2004-July/000544.html Another is to mimic W3C XML Schema, which tries to avoid this problem by not reading schemas more than once from the same location. This approach is very similar to "#pragma once" of the C and C++ programming languages. http://en.wikipedia.org/wiki/Pragma_once However, this approach does not work quite well when different URIs reference to the same schema module. In fact, this has been considered as one of the disadvantages of "#pragma once". I would like to suggest something similar to "#include guards". It is an old friend of C programmers. It is implemented by a combination of #define and #ifndef. http://en.wikipedia.org/wiki/Include_guard For example, #ifndef H_GRANDFATHER #define H_GRANDFATHER struct foo { int member; }; #endif makes sure that this header file is included only once. In the RNC setting, I would like to incorporate something like guard "http://www.example.com/grandfather" How do people feel? -- MURATA Makoto (FAMILY Given) <EB2M-MRT@asahi-net.or.jp>
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]