2016-03-01 76 views
1

我有要求用户根据@base属性制作专门化属性@ a,@ b,@ c。而@a和@b适用于所有元素,但对于@c而言,仅适用于<fig>元素。 OASIS方案(DTD)中存在元素<fig>,它不是我的专业元素。属性专门化和约束模块

据我所知,可以通过下面的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

最重要的一点是通过最低限度的符合方式为现有的(OASIS TC提供的)元素添加新的属性。最初的讨论可以在[https://groups.yahoo.com/neo/groups/dita-users/conversations/topics/39272](https://groups.yahoo.com/neo/groups/dita-users)中找到。/conversations/topics/39272) – tmakita

回答

1

这取决于你需要如何处理@c,我想。如果不需要像@base那样处理,则可以通过专门的<fig>元素将其添加。

编辑: 作为@JulioV说,根据@base@props特是全球性的。我建议使用Schematron验证来强制作者不要使用特定元素上的属性。这也适用于Oxygen XML。

这是一个小Schematron示例,该示例禁止使用<fig>元素上的@id属性并提供Schematron Quick Fix来删除该属性。

<?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> 


+0

专注''与我的意图不符。参考讨论在这里:[https://groups.yahoo.com/neo/groups/dita-users/conversations/topics/39272](https://groups.yahoo.com/neo/groups/dita-users/ conversations/topics/39272) – tmakita

+0

感谢您给Schematron示例。但对我的问题没有意义。 – tmakita

1

DITA架构使得任何属性的专业化,无论是在@base或@props做是全球性的。将变量约束到特定元素的唯一方法是遍历所有模块,并确保仅在元素上包含属性的域需要该属性。将XML编辑器配置为只显示需要属性的元素的属性可能会更容易。

+0

你使用“variable”这个词的背景是什么? – tmakita

0

另一种方法是创建一个不严格符合100%的约束条件,但要方便得多。

也就是说,你必须声明的属性,就像你会为一个全球性的@props或@base专业化正常属性域模块。

但不是正常地集成它(这会使其成为全局的),而不是不集成它。

相反,你创建一个单独的约束模块,只是添加属性,你希望它出现的元素类型。

这给你同样的效果,如果你已经重新声明,除了那些你希望它出现,但显然是实用,而不是不切实际的元素的每个属性列表。

这仍然是因为它是制约否则这将是一个全球性的属性,是一个有限的使用属性的约束。

如果有需要作出的声明100%严格符合,那么你只需删除约束,通常集成属性,使其全球。没有现有的文档会因此而中断。

+0

谢谢!我会尝试这种方法。 – tmakita