我要求用户根据@base属性制作特殊化属性@ a,@ b,@ c。并且@a和@b适用于所有元素,但对于@c,希望仅将其用于<fig>
元素。 <fig>
元素存在于OASIS方案(DTD)中,而不是我的专业元素。
据我所知,属性专业化可以通过以下RELAX NG编码完成。
<define name="aAtt-d-attribute">
<optional>
<attribute name="a">
<a:documentation>Specifies @a to which an element applies.
</a:documentation>
</attribute>
</optional>
</define>
<define name="base-attribute-extensions" combine="interleave">
<ref name="aAtt-d-attribute"/>
</define>
但我不知道如何在RELAX NG中为@c编写约束模块并将它们集成到shell .rng文件中。请给我你的建议。
答案 0 :(得分:1)
我认为这取决于您需要如何处理@c
。如果不必像@base
那样进行处理,您可以通过专门的<fig>
元素添加它。
修改强>
正如@JulioV所说,基于@base
或@props
的专业化是全球性的。我建议使用Schematron验证来强制作者不要在特定元素上使用属性。这也适用于Oxygen XML。
这是一个小型Schematron示例,禁止在@id
元素上使用<fig>
属性,并提供Schematron快速修复以删除属性。
<?xml version="1.0" encoding="UTF-8"?>
<sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron"
queryBinding="xslt2"
xmlns:sqf="http://www.schematron-quickfix.com/validator/process">
<sch:pattern>
<sch:rule context="*[contains(@class, ' topic/fig ')]">
<sch:assert test="not(@id)" sqf:fix="removeId">
Figure elements must not have an ID.
</sch:assert>
<sqf:fix id="removeId">
<sqf:description>
<sqf:title>Remove ID</sqf:title>
</sqf:description>
<sqf:delete match="@id"/>
</sqf:fix>
</sch:rule>
答案 1 :(得分:1)
DITA体系结构使得任何属性专门化,无论是在@base还是@props上完成,都是全局的。将变量约束到特定元素的唯一方法是遍历所有模块,并确保仅在元素上包含属性的域包含该属性。将XML编辑器配置为仅在需要属性的元素上显示属性可能更容易。
答案 2 :(得分:0)
另一种方法是创建一个不是100%严格符合的约束,但更方便。
即,您有一个普通的属性域模块,它声明该属性,就像对全局@props或@base特化一样。
但是,不要将它正常地集成(这会使它成为全局),而是不要将它集成。
相反,您可以创建一个单独的约束模块,只需将该属性添加到您希望它出现的元素类型中。
这样可以产生与重新声明每个属性列表相同的效果,除了那些要显示的元素,但显然是实用的,而不是不切实际的。
这仍然是一个限制因素,它限制了全局属性作为限制使用属性的内容。
如果需要使声明100%严格符合,那么您只需删除约束并正常集成属性,使其成为全局。结果不会破坏现有文档。