Генерация DTD из многофайловой схемы RelaxNG

У меня есть схема RelaxNG, разбитая на несколько .rnc файлов. Я хотел бы иметь возможность конвертировать их в DTD, но trang жалуется на то, что я использую директиву external:

$ trang schema/text.rnc schema/text.dtd
[...]/schema/text.rnc:3:6: error: sorry, "externalRef" is not supported
[...]/schema/text.rnc:4:9: error: sorry, "externalRef" is not supported
[...]/grcxml/schema/text.rnc:6:15: error: sorry, "externalRef" is not supported
[...]/schema/text.rnc:3:6: error: sorry, "externalRef" is not supported
Exception in thread "main" java.lang.NullPointerException
        at com.thaiopensource.relaxng.output.dtd.ContentType.ref(ContentType.java:138)
        at com.thaiopensource.relaxng.output.dtd.Analysis$Analyzer.visitRef(Analysis.java:232)
        at com.thaiopensource.relaxng.output.dtd.Analysis$Analyzer.visitRef(Analysis.java:78)
        at com.thaiopensource.relaxng.edit.RefPattern.accept(RefPattern.java:9)
        at com.thaiopensource.relaxng.output.dtd.Analysis$Analyzer.analyzeContentType(Analysis.java:336)
        at com.thaiopensource.relaxng.output.dtd.Analysis$Analyzer.visitGroup(Analysis.java:216)
        at com.thaiopensource.relaxng.output.dtd.Analysis$Analyzer.visitGroup(Analysis.java:78)
        at com.thaiopensource.relaxng.edit.GroupPattern.accept(GroupPattern.java:5)
        at com.thaiopensource.relaxng.output.dtd.Analysis$Analyzer.analyzeContentType(Analysis.java:336)
        at com.thaiopensource.relaxng.output.dtd.Analysis$Analyzer.visitElement(Analysis.java:118)
        at com.thaiopensource.relaxng.output.dtd.Analysis$Analyzer.visitElement(Analysis.java:78)
        at com.thaiopensource.relaxng.edit.ElementPattern.accept(ElementPattern.java:9)
        at com.thaiopensource.relaxng.output.dtd.Analysis$Analyzer.analyzeContentType(Analysis.java:336)
        at com.thaiopensource.relaxng.output.dtd.Analysis$Analyzer.visitRef(Analysis.java:232)
        at com.thaiopensource.relaxng.output.dtd.Analysis$Analyzer.visitRef(Analysis.java:78)
        at com.thaiopensource.relaxng.edit.RefPattern.accept(RefPattern.java:9)
        at com.thaiopensource.relaxng.output.dtd.Analysis$Analyzer.analyzeContentType(Analysis.java:336)
        at com.thaiopensource.relaxng.output.dtd.Analysis$Analyzer.visitDefine(Analysis.java:288)
        at com.thaiopensource.relaxng.output.dtd.Analysis$Analyzer.visitDefine(Analysis.java:78)
        at com.thaiopensource.relaxng.edit.DefineComponent.accept(DefineComponent.java:39)
        at com.thaiopensource.relaxng.output.dtd.Analysis$Analyzer.visitContainer(Analysis.java:278)
        at com.thaiopensource.relaxng.output.dtd.Analysis$Analyzer.visitGrammar(Analysis.java:258)
        at com.thaiopensource.relaxng.output.dtd.Analysis$Analyzer.visitGrammar(Analysis.java:78)
        at com.thaiopensource.relaxng.edit.GrammarPattern.accept(GrammarPattern.java:14)
        at com.thaiopensource.relaxng.output.dtd.Analysis$Analyzer.analyzeContentType(Analysis.java:336)
        at com.thaiopensource.relaxng.output.dtd.Analysis.<init>(Analysis.java:534)
        at com.thaiopensource.relaxng.output.dtd.DtdOutputFormat.output(DtdOutputFormat.java:22)
        at com.thaiopensource.relaxng.translate.Driver.run(Driver.java:144)
        at com.thaiopensource.relaxng.translate.Driver.main(Driver.java:44)

Способность Транга впихнуть такую ​​выразительную схему, как RelaxNG, в тусклое DTD кажется достаточно чудесным, и этот контрольно-пропускной пункт меня удивляет. external include настолько удобен для обмена определениями между схемами, что я бы не хотел их потерять. Что было бы лучшим способом сделать это возможным?


person David Eyk    schedule 14.03.2014    source источник


Ответы (2)


Если вас не волнует, что DTD не будет реплицировать разделение на файлы исходного кода, вы можете сначала использовать jing:

$ jing -s source.rng > intermediate.rng
$ trang intermediate.rng final.dtd

Первый шаг объединит все в один файл. Второй конвертирует.

person Louis    schedule 14.03.2014
comment
Кажется, это поможет (хотя теперь он жалуется на то, что я использую чередование... ай-йи-йи). Спасибо! - person David Eyk; 14.03.2014
comment
Документирован ли -s где-нибудь? Я не могу найти его на сайте Jing. - person David Eyk; 14.03.2014
comment
Я помню, что видел это где-то некоторое время назад, но, возможно, это было в списке рассылки или что-то в этом роде. Единственное немедленное подтверждение его существования, которое я получаю от jing, это если я делаю $ jing без параметров. Он указан среди опций, но jing не говорит, что он делает. - person Louis; 14.03.2014
comment
Цзин и Транг откровенно лаконичны в описании того, что они делают. - person David Eyk; 14.03.2014

Я думаю, вы можете использовать Trang для преобразования компактной схемы .rnc в .rng, которая должна включать внешние схемы в основную схему. Если у вас есть один файл .rng, вы можете преобразовать его в DTD.

См. также https://code.google.com/p/jing-trang/issues/detail?id=51 и https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=264706 .

person Rintze Zelle    schedule 14.03.2014
comment
Полезные ссылки, но @Louis хорошо их обобщил. Спасибо! - person David Eyk; 14.03.2014