home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1993 #1 / NN_1993_1.iso / spool / comp / text / sgml / 1281 < prev    next >
Encoding:
Text File  |  1993-01-11  |  8.1 KB  |  189 lines

  1. Path: sparky!uunet!ralvm13.VNET.IBM.COM
  2. From: drmacro@ralvm13.VNET.IBM.COM
  3. Message-ID: <19930110.211516.255@almaden.ibm.com>
  4. Date: Sat, 9 Jan 93 10:25:48 EST
  5. Newsgroups: comp.text.sgml
  6. Subject: Re: Separation of text and markup
  7. Disclaimer: This posting represents the poster's views, not those of IBM
  8. News-Software: UReply 3.1
  9. References: <C0BsDK.5G2@undergrad.math.waterloo.edu> <19930105.004@erik.naggum.no> <1993Jan8.194217.9341@linus.mitre.org>
  10.             <19930108.007@erik.naggum.no>
  11. Lines: 176
  12.  
  13. In <19930108.007@erik.naggum.no> Erik Naggum <SGML@ifi.uio.no> writes:
  14. >I've thought a little more about this, and maybe someone out there can use
  15. >an idea I had.  It goes like this:
  16. >
  17. >Assume that we have text files that do not contain any markup, i.e. so that
  18. >we won't need to parse their contents in any way if we refer to and extract
  19. >text from them, and, as a corollary, element contents are not split across
  20. >files (entities).
  21. >
  22. >Assume that we have a document type which does not have both elements and
  23. >data in element contents.
  24. >
  25. >Assume that we have an entity manager that can extract portions of an
  26. >entity given an entity, a starting point and a length, however specified.
  27. >
  28. >For each element that contains PCDATA in the DTD, define three attributes
  29. >
  30. >   contents ENTITY   #CONREF
  31. >   start    NUMBERS  #IMPLIED
  32. >   length   NUMBERS  #IMPLIED
  33. >
  34. >(with the understanding that _start_ and _length_ are REQUIRED if
  35. >_contents_ is specified).
  36. >
  37. >The start and length are both NUMBERS because we might have a record-based
  38. >storage system that must address a given character by record and position
  39. >within a record, as well as one that can address characters individually.
  40. >
  41. >Then, the element structure can be kept in a "regular" SGML document, which
  42. >in the document type declaration subset identifies the entities to which
  43. >references are made in the start-tags in this document, and the application
  44. >can request the element contents from the entity manager while receiving
  45. >the element structure from the parser.
  46. >
  47. >I know of no entity manager that allows this flexibility, but that doesn't
  48. >mean none exist, or can't exist.  (I also imagine that this kind of data
  49. >extraction service will be required by an entity manager to be used with
  50. >HyTime engines.)
  51.  
  52. You can get the same functionality by using one level of indirection
  53. and standard HyTime addressing elements.  Simply define a location
  54. ladder that ends with a data location element that specifies the
  55. location and extent of the data to grab (in these examples I've
  56. simplified as allowed by HyTime for brevity):
  57.  
  58. <!-- First define common attributes to do content-reference: -->
  59. <!ENTITY %conref.att
  60.         "ContentSource IDREF  #CONREF  -- source of element content --
  61.          HyNames       CDATA  #FIXED 'ContentSource linkend'
  62.          HyTime        NAME   #FIXED clink" -- conceptually a clink --
  63. >
  64.  
  65. <!-- Now define element to contain HyTime elements, for neatness: -->
  66. <!ELEMENT ContentRefSpec  - - (nameloc, dataloc+) >
  67. <!ATTLIST ContentRefSpec HyTime NAME #FIXED hybrid>
  68.  
  69. <!-- Now define nameloc and dataloc elements.  These are standard
  70.      HyTime. DatalocSource defines source of data for dataloc. -->
  71. <!ELEMENT (nameloc | DataLocSource)
  72.                    O O (nmlist) -- nmquery omitted for simplicity --
  73. >
  74. <!ATTLIST (nameloc | DataLocSource)
  75.                    HyTime NAME #FIXED nameloc
  76.                    ID     ID   #REQUIRED
  77. >
  78. <!ELEMENT nmlist  O O (#PCDATA) -- lextype(NAMES) -->
  79. <!-- Attlist omitted for simplicity -->
  80. <!-- Now define Dataloc element, again, HyTime: -->
  81.  
  82. <!ELEMENT dataloc O O (dimspec*) -- Will define data locations -->
  83. <!-- Content model reduced to 'dimspec' for simplicity -->
  84. <!ATTLIST dataloc HyTime NAME #FIXED dataloc
  85.                   id     ID   #REQUIRED
  86.                   locsrc IDREFS   #REQUIRED -- no logical default --
  87.           -- other attributes omitted for simplicity --
  88. >
  89.  
  90. <!ELEMENT dimspec O O (marklist, marklist) >
  91. <!ELEMENT marklist - O (#PCDATA) -- Lextype(snzi*) -->
  92. <!-- Content model reduced to '#PCDATA' for simplicity -->
  93.  
  94. <!-- Now define our application-specific elements.  All will
  95.      use the common content reference attributes: -->
  96. <!ELEMENT MyData  - - (%mydata.el;)* -- typical element -->
  97. <!ATTLIST MyData
  98.           %conref.att;
  99. >
  100.  
  101. I've defined the omission indicators such that for manual
  102. typing, you only have to specify a few of the tags to
  103. create a reference:
  104.  
  105. <!-- In the DTD, define the entity that contains the data: -->
  106.  
  107. <!ENTITY thedata SYSTEM "data.file" CDATA >
  108.  
  109. <!-- Now use DataLocSource to create the entity reference. This
  110.      will be refered to from DataLoc with the locsrc= attribute: -->
  111. <DataLocSource id=mydata nametype=entity>thedata</>
  112.  
  113. <!-- stream-oriented (one dimension) reference: -->
  114. <!-- Note that ContentRefSpec is implied by nameloc. -->
  115. <nameloc id=dataref1>dimspec1
  116.  <dataloc id=dimspec1 locsrc=mydata>
  117.  <marklist>10 100
  118. <MyData contentref=dataref1>
  119.  
  120. <!-- line-oriented (two dimensions) reference: -->
  121. <nameloc id=dataref2>dimspec2
  122.  <dataloc id=dimspec2 locsrc=mydata>
  123.   <marklist>1 1<!-- First record -->
  124.   <marklist>10 -1<!-- 10th through last character -->
  125. <MyData contentref=dataref2>
  126.  
  127. Interestingly enough, Erik's notation could be transformed
  128. into what I've defined above on the fly by an application.
  129. It would not itself be HyTime conforming or directly
  130. processible by a HyTime system, but it could be transformed
  131. into "virtual SGML" dynamically and then passed to a HyTime
  132. system.  Note also that the above method allows the
  133. use of multiple data locations that can be aggregated
  134. into a single value when the location chain is resolved.
  135.  
  136. You can also define some application-specific simplifications.
  137. For example, since I have namelocs and datalocs contained within
  138. a common element, I could define the processing semantic for
  139. my application such that the nameloc element is implied by
  140. the existence of the dataloc elements within the ContentRefSpec
  141. element.  The application defines the nameloc ID, perhaps by taking
  142. the nameloc ID value from an attribute of the ContentRefSpec:
  143.  
  144. <!ELEMENT ContentRefSpec  - - (nameloc, dataloc+) >
  145. <!ATTLIST ContentRefSpec HyTime NAME #FIXED hybrid
  146.           id            NAME   #REQUIRED  -- defines nameloc ID --
  147.           DataContainer ENTITY #REQUIRED  -- defines locsrc value --
  148. >
  149. <!ELEMENT nameloc O O (nmlist) -- nmquery ommitted for simplicity --
  150. <!ATTLIST nameloc  HyTime NAME #FIXED nameloc
  151.                    ID     ID   #IMPLIED  -- From ContentRefSpec --
  152. >
  153. <!ELEMENT dataloc O O (marklist) >
  154. <!ATTLIST dataloc  HyTime NAME #FIXED dataloc
  155.                    ID     ID   #IMPLIED  -- Defined by processor --
  156.                    locsrc ID   #IMPLIED  -- From ContentRefSpec  --
  157. >
  158.  
  159. The ID= attribute on ContentRefSpec is not of type ID, so
  160. it's value will not be part of the SGML ID name space, but we
  161. can define an application semantic that uses the ContentRefSpec
  162. ID= value to provide the now implied nameloc ID.  Because
  163. ID= is required on ContentRefSpec, it is effectively required
  164. for nameloc, thus meeting the requirement of ISO 10744.  If
  165. we further define the Dataloc ID to be implied by the containment
  166. structure, we reduce the actual required markup to:
  167.  
  168. <ContentRefSpec id=dataref1 datacontainer=thedata>
  169.   <marklist>1 1
  170. </ContentRefSpec>
  171.  
  172. Similarly, the location source specification is simplified by the
  173. ENTITY attribute DataContainer, which is used to create a virtual
  174. nameloc for the ID-to-entity mapping needed by dataloc.  The nameloc,
  175. nmlist, and dataloc elements are all omissible and the required
  176. attributes are now implied unambiguously.  The ContentRefSpec clearly
  177. identifies the application-specific semantic of this particular
  178. hyperlink and the details of the HyTime stuff is hidden (or at least
  179. hideable).  This does require that the HyTime elements not be part of the
  180. general content of your application, because it would be a violation
  181. to allow nameloc with implied ID outside a context that guarantees
  182. specification of an ID by some mechanism.
  183.  
  184. Eliot Kimber                      Internet:  drmacro@ralvm13.vnet.ibm.com
  185. Dept E14/B500                     IBMMAIL:   USIB2DK9@IBMMAIL
  186. Network Programs Information Development     Phone: 1-919-543-7091
  187. IBM Corporation
  188. Research Triangle Park, NC 27709
  189.