2016-03-01 37 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