属性专业化&约束模块

时间:2016-03-01 01:13:42

标签: dita

我要求用户根据@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文件中。请给我你的建议。

3 个答案:

答案 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%严格符合,那么您只需删除约束并正常集成属性,使其成为全局。结果不会破坏现有文档。