Re: Executable Specs [was Introduction: Graham Klyne]

Hi Jos,

jos.deroo.jd@belgium.agfa.com wrote:

> 
> Brian, is that informal experiment using an attribute grammar
> with an XSLT implementation the one at
> http://www.bmcb.btinternet.co.uk/2001/rdf/exec-grammar/spec.xsl ?

Yes, and thanks for picking up on that.  It would be good discipline for
us always to provide references where possible.

The above URL is not likely to be very persistent so to make sure its in
the archive I've included the document at the end of this message.
 
Brian

====================================================================

<?xml version='1.0'?>
<!-- Author:  Brian McBride $Revision: 1.8 $ $Date: 2001/02/22 12:31:14
$ -->
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
                xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
                xmlns:rdfg='http://purl.org/NET/BMCB/2001/RDFG'
                exclude-result-prefixes='xsl rdf rdfg'>

<!-- An experiment in doing a formal specification of the RDF Syntax.
     The goal is to more formally define the triples that any given
     RDF XML represents.

     The idea is to annotate the grammar with attributes.  Each
production
     in the grammar takes attributes as arguments and can return
attributes
     as a result.  A production emitTriple, which always succeeds but
has
     the side effect of emitting a triple is introduced.

     There is a trivial transformation from the annotated grammar to an
     equivalent XSLT transform, thus in effect enabling an executable
     specification.

     @@ISSUE aboutEach not handled
     @@Issue aboutEachPrefix

     @@TODO Oops - forgot xml:lang
     @@TODO consider if XML Schema should be used to express the
grammar.
     @@TODO consider Schematron
     @@TODO search for 'proper' attribute grammar tools

The annotated grammar is as follows:

        // Constants

           RDFNS           =
'http://www.w3.org/1999/02/22-rdf-syntax-ns#'
           RDFGNS          = 'http://purl.org/NET/BMCB/2001/RDFG/'
           HASMEMBER       = 'hasMember'      // container membership
property
           TYPE            = 'type'
           BAG             = 'Bag'
           URI             = 'URI'
           ANON            = 'ANON'
           ABOUTEACH       = 'aboutEach'
           ABOUTEACHPREFIX =
           LITERAL         = 'LITERAL'
           NONE            = 'NONE'
           AUTO            = 'NONE'           // change to 'anon' to
turn on
                                              // creation of bags for
all
                                              // description elements

  [6.1] RDF()            ::= ['<rdf:RDF>'] 
                             obj*((NONE, ''), ('', ''),
                                  ( NONE, ''),  (NONE, '') 
                             ['</rdf:RDF>']

        // dropped the container productions - used mcbride/beckett
approach
        // The obj production can either be a top level resource
immediately
        // within an enclosing rdf:RDF or it can be the object of a
statement.
        //
        // Input Attributes:
        //   subject(Type, Valu)      type is none for top level
        //   predicate(ns, localname)
        //   bag(Type, Valu, next)    to hold reifications
        //   rsid                     id of reified statement

  [6.2] obj(subject, predicate, bag, rsid)
                         ::= description(subject, predicate, bag, rsid)

  [6.2.1] obj*(subject, predicate, bag, rsid)
                         ::= obj(subject, predicate, bag, rsid)
                             obj*(subject, predicate,
                                  (bag.type, bag.value), rsid)
                           |

  [6.3] description(subject, predicate, bag, rsid)
                         ::= '<rdf:Description' 
                               idAboutAttr?
                               emitTriple(rsid, subject, predicate,
                                          (idAboutAttr.Type,
idAboutAttr.Valu))
                               emitTriple((NONE, ''),bag, 
                                          (RDFGNS, HASMEMBER), rsid)
                               bagIdAttr?
                               emitTriple((NONE, ''),
                                          (bagIdAttr.Type,
bagIdAttr.valu),
                                          (RDFNS, TYPE),
                                          (URI, RDFNS+BAG))
                               propAttr*((idAboutAttr.Type,
idAboutAttr.Valu),
                                         (bagIdAttr.Type,
bagIdAttr.Valu), 0)
                              '/>'
                         | '<rdf:Description'
                           idAboutAttr?
                           emitTriple(rsid, subject, predicate,
                                      (IidAboutAttr.Type,
idAboutAttr.Valu))
                           emitTriple((NONE, ''), bag, 
                                          (RDFGNS, HASMEMBER), rsid)
                           bagIdAttr?
                           emitTriple((NONE, ''),
                                      (bagIdAttr.Type, bagIdAttr.valu),
                                      (RDFNS, TYPE),
                                      (URI, RDFNS+BAG))
                           propAttr*((idAboutAttr.Type,
idAboutAttr.Valu),
                                     (bagIdAttr.Type, bagIdAttr.Valu),
0)
                           '>'
                            propertyElt*(subject,
                                         (bagIdAttr.Type,
bagIdAttr.Valu))
                           '</rdf:Description>'
                         | typedNode(subject, predicate, bag, rsid)

  [6.4] // container production deleted

  [6.5] idAboutAttr?   ::= idAttr
                           this.Type = idAttr.Type
                           this.Valu = idAttr.Valu

                         | aboutAttr
                           this.Type = aboutAttr.Type
                           this.Valu = aboutAttr.Valu

                         | aboutEachAttr
                           this.Type = aboutEachAttr.Type
                           this.Valu = aboutEachAttr.Value

                         | this.Type = ANON
                           this.Valu = genid()

  [6.6] idAttr         ::= ' ID="' IDsymbol '"'
                            this.Type=URI
                            this.Valu=BASEURI() + '#' + IDsymbol
  [6.6.1]idAttr?       ::= idAttr
                           this.Type=idAttr.Type
                           this.Valu=idAttr.Valu
                         | this.Type = NONE
                           this.Valu=''

  [6.7] aboutAttr      ::= ' about="' URI-reference '"'
                           this.Type=URI
                           this.Valu = ABSOLUTE(URI-reference)

  [6.8] aboutEachAttr  ::= ' aboutEach="' URI-reference '"'
                           this.Type = ABOUTEACH
                           this.Valu = ABSOLUTE(URI-reference)

                         | ' aboutEachPrefix="' string '"'
                           this.Type = ABOUTEACHPREFIX
                           this.Valu = string

  [6.9] bagIdAttr?      ::= ' bagID="' IDsymbol '"'
                            this.Type = URI
                            this.Valu = BASEURI + '#' + IDsymbol
                          | this.Type = AUTO
                            this.Value = genid()

 [6.10] propAttr(subject, bag, maxOrd)
                        ::= 'xml:lang="' string '"'         // ignore
                            this.maxOrd = 0
                          | 'xmlns:' name '="' string '"'   // ignore
                            this.maxOrd = 0
                          | 'ID="' string '"'               // ignore
                            this.maxOrd = 0
                          | 'about="' string '"'            // ignore
                            this.maxOrd = 0
                          | 'aboutEach="' string '"'        // ignore
                            this.maxOrd = 0
                          | 'aboutEachPrefix="' string '"'  // ignore
                            this.maxOrd = 0
                          | 'bagID'                         // ignore
                            this.maxOrd = 0
                          | typeAttr(subject, bag)
                            this.maxOrd = 0
                          | 'rdf:li="' string '"'
                            this.stmtType = 
                                    if bag.Type==NONE then NONE else
ANON
                            this.stmtValu = genid()
                            emitTriple((this.stmtType, this.stmtValu),
                                       subject, 
                                       (RDFNS, '_1') 
                                       (LITERAL, string))
                            emitTriple((NONE, ''), bag,
                                       (RDFGNS, HASMEMBER),
                                       (this.stmtType, this.stmtValu))
                            this.maxOrd = 1
                          | propName '="' string '"'        // with
embedded
                                                            // quotes
escaped
                            this.stmtType = 
                                     if bag.Type==NONE then NONE else
ANON
                            this.stmtValu = genid()
                            emitTriple((this.stmtType, this.stmtValu),
                                       subject, 
                                       (propName.ns, propName.namespace) 
                                       (LITERAL, string))
                            emitTriple((NONE, ''), bag,
                                       (RDFGNS, HASMEMBER),
                                       (this.stmtType, this.stmtValu))
                            this.maxOrd = maxOrd(maxOrd, propName.ns,
                                                   propName.localname)

 [6.10.1] propAttr*(subject, bag, maxOrd)
                        ::= propAttr(subject, bag)
                            propAttr*(subject, bag)
                            this.maxOrd=max(maxOrd, propAttr.maxOrd,
                                             propAttr*.maxOrd)
                          |

 [6.11] typeAttr(subject, bag)
                        ::= ' type="' URI-reference '"'
                            this.stmtType = 
                                       if bag.Type==NONE then NONE else
ANON
                            this.stmtValu = genid()
                            emitTriple((this.stmtType, this.stmtValu),
                                       subject, (RDFNS, TYPE),
                                       (URI, URI-reference))
                            emitTriple((NONE, '') bag,
                                       (RDFGNS, HASMEMBER),
                                       (this.stmtType, this.stmtValu))

 [6.12] propertyElt(subject, bag)
                       ::= '<' propName
                               rsidAttr?(bag)          // modifed from
idAttr?
                           '>' value(subject, 
                                     (propName.ns, propName.localname),
bag,
                                     (rsidAttr?.Type, rsidAttr?.Valu))
                           '</' propName '>'

                         | '<' propName
                               rsidAttr?(bag)         // modified from
idAttr?
                               parseLiteral '>'
                               literal 
                               '</' propName '>'
                           emitTriple((rsidAttr?.Type,rsidAttr?.Valu),
subject,
                                      (propName.ns, propName.localname),
                                      (LITERAL, literal)

                           emitTriple((NONE, ''), bag,
                                      (RDFG, HASMEMBER),
                                      (rsidAttr?.Type, rsidAttr?.Valu))

                         | '<' propName
                               rsidAttr?(bag)        // modified from
idAttr?
                               parseResource '>'
                           this.objectType = ANON
                           this.objectValu = genid()
                           emitTriple((rsidAttr?.Type, rsidAttr?.Valu)
                                      subject,
                                      (propName.ns, propName.localname),
                                      (this.objectType,
this.objectValu))

                           emitTriple((NONE, ''), bag,
                                      (RDFG, HASMEMBER)
                                      (rsidAttr.Type, rsidAttr.Valu))

                           this.bagType = AUTO
                           this.bagValu = genid()
                           emitTriple((NONE, '')
                                      (this.bagType, this.bagValu),
                                      (RDFNS, TYPE),
                                      (URI, RDFNS+BAG)

                           propertyElt*((this.objectType,
this.objectValu),
                                        (this.bagType, this.bagValu))
                           '</' propName '>'
                         | '<' propName
                           idRefAttr?
                           this.stmtType = 
                                      if bag.Type==NONE then NONE else
ANON
                           this.stmtValu = genid()
                           emitTriple( this.stmtType, this.stmtValu),
                                       subject,
                                      (propName.ns, propName.localname),
                                      (idRefAttr.Type, idRefAttr.Valu))

                           emitTriple((NONE, ''), bag,
                                      (RDFG, HASMEMBER),
                                      (this.stmtType, this.stmtValu))

                           bagIdAttr?
                           emitTriple((NONE, ''),
                                      (bagIdAttr.Type, bagIdAttr.valu),
                                      (RDFNS, TYPE),
                                      (URI, RDFNS+BAG))
                           propAttr*((idRefAttr.Type, idRefAttr.Valu),
                                     (bagIdAttr.type, bagIdAttr.value),
0) 
                           '/>'

        // new alternative added to handle unknown parseType's

                         | '<' propName
                               rsidAttr?(bag)
                               parseType '>'         // other parse
types
                                                     // treated as
literal
                               literal 
                               '</' propName '>'
                           emitTriple((rsidAttr?.Type, rsidAttr?.Valu),
                                       subject,
                                      (propName.ns, propName.localname),
                                      (LITERAL, literal)

                           emitTriple((NONE, ''), bag,
                                      (RDFG, HASMEMBER) ,
                                      (rsidAttr?.Type, rsidAttr.Valu))

 [6.13] typedNode(subject, predicate, bag, rsid)
                       ::= '<' typeName
                           idAboutAttr?
                           emitTriple(rsid, subject, predicate,
                                      (idAboutAttr?.Type,
idAboutAttr?.Valu))
                           emitTriple((NONE, ''), bag, (RDFG,
HASMEMBER), rsid)
                           bagIdAttr? 
                           emitTriple((NONE, ''),
                                      (bagIdAttr.Type, bagIdAttr.valu),
                                      (RDFNS, TYPE),
                                      (URI, RDFNS+BAG))
                           this.stmtType = 
                                  if bagIdAttr.Type==NONE then NONE else
ANON
                           this.stmtValu = genid()
                           emitTriple((this.stmtType, this.stmtValu), 
                                      (idAboutAttr.Type,
idAboutAttr.valu),
                                      (RDFNS, TYPE),
                                      (URI, typeName.ns +
typename.Qname))

                           emitTriple((NONE, ''),
                                      (bagIdAttr?.Type, bagIdAttr?.Valu,
                                      (RDFG, HASMEMBER),
                                      (this.stmtType, this.stmtValu)

                           propAttr*((idAboutAttr.type,
idAboutAttr.valu),
                                     (bagIdAttr.type, bagIdAttr.value),
0) 
                           '/>'
                         | '<' typeName
                           idAboutAttr?
                           emitTriple(rsid, subject, predicate,
                                      (idAboutAttr?.Type,
idAboutAttr?.Valu))
                           emitTriple((NONE, ''), bag, (RDFG,
HASMEMBER), rsid)
                           bagIdAttr? 
                           emitTriple((NONE, ''),
                                      (bagIdAttr.Type, bagIdAttr.valu),
                                      (RDFNS, TYPE),
                                      (URI, RDFNS+BAG))
                           this.stmtType =
                                  if bagIdAttr.Type==NONE else ANON
                           this.stmtValu = genid()
                           emitTriple((this.stmtType, this.stmtValu), 
                                      (idAboutAttr.Type,
idAboutAttr.valu),
                                      (RDFNS, TYPE),
                                      (URI, typeName.ns +
typename.Qname))

                           emitTriple((NONE, ''),
                                      (bagIdAttr?.Type, bagIdAttr?.Valu,
                                      (RDFG, HASMEMBER),
                                      (this.stmtType, this.stmtValu)

                           propAttr*((idAboutAttr.type,
idAboutAttr.valu),
                                     (bagIdAttr.type, bagIdAttr.value),
0) 

                           propertyElt*((idAboutAttr.Type,
idAboutAttr.Valu),
                                        (bagIdAttr.Type,
bagIdAttr.Valu))
                           '</' typeName '>'
 [6.14] propName       ::= Qname
                           this.ns = Qname.ns
                           this.localname = Qname.localname
 [6.15] typeName       ::= Qname
                           this.ns = Qname.ns
                           this.localname = Qname.localname

 [6.16] idRefAttr?     ::= idAttr 
                           this.Type = idAttr.Type
                           this.Valu = idAttr.Valu
                         | resourceAttr
                           this.Type = resourceAttr.Type
                           this.Valu = resourceAttr.Valu
                         | this.Type = ANON
                           this.Valu = genid()

 [6.17] value(subject, predicate, bag, rsid)
                        ::= obj(subject, predicate, bag, rsid) 
                          | string
                           emitTriple(rsid, subject, predicate,
                                      (LITERAL, string))

                           emitTriple((NONE, ''), bag,
                                      (RDFNS, '_'+ bagNext), rsid)

 [6.18] resourceAttr   ::= ' resource="' URI-reference '"'
                           this.Type = URI
                           this.Valu = URI-reference

 [6.19] Qname          ::= [ NSprefix ':' ] name
                           this.ns = namespaceURI(NSprefix)
                           this.localname = name

 [6.20] URI-reference  ::= string, interpreted per [URI]
 [6.21] IDsymbol       ::= (any legal XML name symbol)
 [6.22] name           ::= (any legal XML name symbol)
 [6.23] NSprefix       ::= (any legal XML namespace prefix)
 [6.24] string         ::= (any XML text, with "<", ">", and "&"
escaped)
 [6.25] // container production deleted
 [6.26] // container produciton deleted
 [6.27] // container production deleted
 [6.28] // container production deleted @@ rdf:li processing todo
 [6.29] // container production deleted
 [6.30] // container production deleted
 [6.31] // container production deleted
 [6.32] parseLiteral   ::= ' parseType="Literal"'
 [6.33] parseResource  ::= ' parseType="Resource"'
 [6.34] literal        ::= (any well-formed XML)

        // new productions here
 [6.35] parseType      ::= ' parseType="' string '"'
 [6.36] rsidAttr?(bag)
                       ::= ' ID="' string '"'
                           this.Type=URI
                           this.Valu=BASEURI() + '#' + string
                         | if bag.Type==NONE
                             this.Type=NONE
                           else
                             this.Type=ANON
                           this.Valu=genid()

=============================================================================

     Now for the XSLT transform.  The output language it produces is as
     follows.  Each statement is output as a statement element.

     The subject is represented by an attribute, either subjURI if the
     subject has a known URI, or subjANON if the subject is anonymous.
     The value of a subjRes attribute is the URI of the resource.  The
     value of the subjAnon attribute is a generated id.

     [@@TODO It doesn't currently handle aboutEach and aboutEachPrefix
      distributed referents properly.  For now, it just outputs a
      single statement for each with either a subjaboutEach or
      subjaboutEachPrefix subject.]

     The predicate of the statement is represented by two attributes, 
     ns and localname.  The value of the ns attribute is the URI of
     the namespace of the predicate.  The value of the localname
     attribute is the localname part of the Qname representing the
     predicate.

     If the object of the statement is a literal, the value of the
     literal is represented as the content of the element.  If the
object
     has an associated language, the statement element has an xml:lang
     attribute whose value is the encoding of that langauge.

     [@@TODO xml:lang processing not done]

     If the object of the statement is a resource, then the statement
     element will have either an objURI attribute or an objAnon 
     attribute.  If the object of the statement is an anonymous
     resource, then the statement has an objURI attribute whose value
     is the URI of the resource.  If the object of the statement is
     anonymous, then the statement element will have an objANONn
     attribute whose value is an internal identifier of the resource.

     Examples:

     <Statement subjURI="http://aldabaran.hpl.hp.com/bwm"
                ns="http://aldabaran.hpl.hp.com/ns/"
                localname="root"
                objURI="http://aldabaran.hpl.hp.com/" />

     <Statement subjANON="1"
                ns="http://aldabaran.hpl.hp.com/ns/"
                localname="title"
                xml:lang="en">The value of a literal object, possibly
                including markup</Statement>
    <Statement subjANON="2"
               ns="http://aldabaran.hpl.hp.com/ns/"
               localname="identity"
               objANON="2"/>

The tranform which follows is not a parser.  It assumes that the input
is
syntactically valid and does no syntax error checking.

-->

  <xsl:output method='xml' indent='yes'/>

  <xsl:variable name='RDFNS' 
               select='"http://www.w3.org/1999/02/22-rdf-syntax-ns#"'/>
  <xsl:variable name='RDFGNS'
                select='"http://purl.org/NET/BMCB/2001/RDFG"'/>
  <xsl:variable name='HASMEMBER'       select='"hasMember"'/>
  <xsl:variable name='TYPE'            select='"type"'/>
  <xsl:variable name='BAG'             select='"Bag"'/>
  <xsl:variable name='URI'             select='"URI"'/>
  <xsl:variable name='ANON'            select='"ANON"'/>
  <xsl:variable name='ABOUTEACH'       select='"aboutEach"'/>
  <xsl:variable name='ABOUTEACHPREFIX' select='"aboutEachPrefix"'/>
  <xsl:variable name='LITERAL'         select='"LITERAL"'/>
  <xsl:variable name='NONE'            select='"NONE"'/>
  <xsl:variable name='AUTO'            select='"NONE"'/>

  <xsl:template match='rdf:RDF'>
    <xsl:call-template name='RDF-6-1'/>
  </xsl:template>

  <xsl:template name='RDF-6-1'>

    <xsl:element name='model'>
      <xsl:for-each select="./*">
        <xsl:call-template name='obj-6-2'>
          <xsl:with-param  name='subjectType' select='$NONE'/>
          <xsl:with-param name='subjectValu' select='""'/>
          <xsl:with-param name='ns' select='""'/>
          <xsl:with-param name='localname' select='""'/>
          <xsl:with-param name='bagType' select='$NONE'/>
          <xsl:with-param name='bagValu' select='""'/>
          <xsl:with-param name='rsidType' select='$NONE'/>
          <xsl:with-param name='rsidValu' select='""'/>
        </xsl:call-template>
      </xsl:for-each>
    </xsl:element>
  </xsl:template>

  <xsl:template name='obj-6-2'>
     <xsl:call-template name='rdfg:description-6-3'>
       <xsl:with-param name='subjectType' select='$subjectType'/>
       <xsl:with-param name='subjectValu' select='$subjectValu'/>
       <xsl:with-param name='ns' select='$ns'/>
       <xsl:with-param name='localname' select='$localname'/>
       <xsl:with-param name='bagType' select='$bagType'/>
       <xsl:with-param name='bagValu' select='$bagValu'/>
       <xsl:with-param name='rsidType' select='$rsidType'/>
       <xsl:with-param name='rsidValu' select='$rsidValu'/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name='rdfg:description-6-3'>   
     <xsl:choose>

      <xsl:when test='namespace-uri()=$RDFNS
                 and local-name()="Description"
                 and not(./*)'>
        <xsl:call-template name='rdfg:p6-3-a'>
           <xsl:with-param name='subjectType' select='$subjectType'/>
           <xsl:with-param name='subjectValu' select='$subjectValu'/>
           <xsl:with-param name='ns' select='$ns'/>
           <xsl:with-param name='localname' select='$localname'/>
           <xsl:with-param name='bagType' select='$bagType'/>
           <xsl:with-param name='bagValu' select='$bagValu'/>
           <xsl:with-param name='rsidType' select='$rsidType'/>
           <xsl:with-param name='rsidValu' select='$rsidValu'/>
        </xsl:call-template>
      </xsl:when>

      <xsl:when test='namespace-uri()=$RDFNS
                 and local-name()="Description"
                 and ./*'>
        <xsl:call-template name='rdfg:p6-3-b'>
           <xsl:with-param name='subjectType' select='$subjectType'/>
           <xsl:with-param name='subjectValu' select='$subjectValu'/>
           <xsl:with-param name='ns' select='$ns'/>
           <xsl:with-param name='localname' select='$localname'/>
           <xsl:with-param name='bagType' select='$bagType'/>
           <xsl:with-param name='bagValu' select='$bagValu'/>
           <xsl:with-param name='rsidType' select='$rsidType'/>
           <xsl:with-param name='rsidValu' select='$rsidValu'/>
        </xsl:call-template>
      </xsl:when>

      <xsl:otherwise>
        <xsl:call-template name='rdfg:typedNode-6-13'>
           <xsl:with-param name='subjectType' select='$subjectType'/>
           <xsl:with-param name='subjectValu' select='$subjectValu'/>
           <xsl:with-param name='ns' select='$ns'/>
           <xsl:with-param name='localname' select='$localname'/>
           <xsl:with-param name='bagType' select='$bagType'/>
           <xsl:with-param name='bagValu' select='$bagValu'/>
           <xsl:with-param name='rsidType' select='$rsidType'/>
           <xsl:with-param name='rsidValu' select='$rsidValu'/>
        </xsl:call-template>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template name='rdfg:p6-3-a'>
    <xsl:variable name='newSubjectType'>
      <xsl:call-template name='rdfg:idAboutAttr-6-5-Type'/>
    </xsl:variable>
    <xsl:variable name='newSubjectValu'>
      <xsl:call-template name='rdfg:idAboutAttr-6-5-Valu'/>
    </xsl:variable>
    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$rsidType'/>
      <xsl:with-param name='rsidValu' select='$rsidValu'/>
      <xsl:with-param name='subjectType' select='$subjectType'/>
      <xsl:with-param name='subjectValu' select='$subjectValu'/>
      <xsl:with-param name='ns' select='$ns'/>
      <xsl:with-param name='localname' select='$localname'/>
      <xsl:with-param name='objectType' select='$newSubjectType'/>
      <xsl:with-param name='objectValu' select='$newSubjectValu'/>
    </xsl:call-template>
    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$NONE'/>
      <xsl:with-param name='rsidValu' select='""'/>
      <xsl:with-param name='subjectType' select='$bagType'/>
      <xsl:with-param name='subjectValu' select='$bagValu'/>
      <xsl:with-param name='ns' select='$RDFGNS'/>
      <xsl:with-param name='localname' select='$HASMEMBER'/>
      <xsl:with-param name='objectType' select='$rsidType'/>
      <xsl:with-param name='objectValu' select='$rsidValu'/>
    </xsl:call-template>

    <xsl:variable name='newBagType'>
      <xsl:call-template name='rdfg:bagIdAttr-6-9-Type'/>
    </xsl:variable>
    <xsl:variable name='newBagValu'>
      <xsl:call-template name='rdfg:bagIdAttr-6-9-Valu'/>
    </xsl:variable>
    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$NONE'/>
      <xsl:with-param name='rsidValu' select='""'/>
      <xsl:with-param name='subjectType' select='$newBagType'/>
      <xsl:with-param name='subjectValu' select='$newBagValu'/>
      <xsl:with-param name='ns' select='$RDFNS'/>
      <xsl:with-param name='localname' select='$TYPE'/>
      <xsl:with-param name='objectType' select='$URI'/>
      <xsl:with-param name='objectValu' select='concat($RDFNS, $BAG)'/>
    </xsl:call-template>

    <xsl:variable name='elementNS'>
      <xsl:value-of select='namespace-uri()'/>
    </xsl:variable>
    <xsl:call-template name='rdfg:propAttrStar-6-10'>
      <xsl:with-param name='nodeSet' select='@*'/>
      <xsl:with-param name='subjectType' select='$newSubjectType'/>
      <xsl:with-param name='subjectValu' select='$newSubjectValu'/>
      <xsl:with-param name='bagType' select='$newBagType'/>
      <xsl:with-param name='bagValu' select='$newBagValu'/>
      <xsl:with-param name='elementNS' select='$elementNS'/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name='rdfg:p6-3-b'>
    <xsl:variable name='newSubjectType'>
      <xsl:call-template name='rdfg:idAboutAttr-6-5-Type'/>
    </xsl:variable>
    <xsl:variable name='newSubjectValu'>
      <xsl:call-template name='rdfg:idAboutAttr-6-5-Valu'/>
    </xsl:variable>
    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$rsidType'/>
      <xsl:with-param name='rsidValu' select='$rsidValu'/>
      <xsl:with-param name='subjectType' select='$subjectType'/>
      <xsl:with-param name='subjectValu' select='$subjectValu'/>
      <xsl:with-param name='ns' select='$ns'/>
      <xsl:with-param name='localname' select='$localname'/>
      <xsl:with-param name='objectType' select='$newSubjectType'/>
      <xsl:with-param name='objectValu' select='$newSubjectValu'/>
    </xsl:call-template>
    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$NONE'/>
      <xsl:with-param name='rsidValu' select='""'/>
      <xsl:with-param name='subjectType' select='$bagType'/>
      <xsl:with-param name='subjectValu' select='$bagValu'/>
      <xsl:with-param name='ns' select='$RDFGNS'/>
      <xsl:with-param name='localname' select='$HASMEMBER'/>
      <xsl:with-param name='objectType' select='$rsidType'/>
      <xsl:with-param name='objectValu' select='$rsidValu'/>
    </xsl:call-template>

    <xsl:variable name='newBagType'>
      <xsl:call-template name='rdfg:bagIdAttr-6-9-Type'/>
    </xsl:variable>
    <xsl:variable name='newBagValu'>
      <xsl:call-template name='rdfg:bagIdAttr-6-9-Valu'/>
    </xsl:variable>
    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$NONE'/>
      <xsl:with-param name='rsidValu' select='""'/>
      <xsl:with-param name='subjectType' select='$newBagType'/>
      <xsl:with-param name='subjectValu' select='$newBagValu'/>
      <xsl:with-param name='ns' select='$RDFNS'/>
      <xsl:with-param name='localname' select='$TYPE'/>
      <xsl:with-param name='objectType' select='$URI'/>
      <xsl:with-param name='objectValu' select='concat($RDFNS, $BAG)'/>
    </xsl:call-template>

    <xsl:call-template name='rdfg:propAttrStar-6-10'>
      <xsl:with-param name='nodeSet' select='@*'/>
      <xsl:with-param name='subjectType' select='$newSubjectType'/>
      <xsl:with-param name='subjectValu' select='$newSubjectValu'/>
      <xsl:with-param name='bagType' select='$newBagType'/>
      <xsl:with-param name='bagValu' select='$newBagValu'/>
      <xsl:with-param name='elementNS' select='namespace-uri()'/>
    </xsl:call-template>

    <xsl:variable name='propAttrMaxOrd'>
      <xsl:call-template name='rdfg:propAttrMaxOrd'>
        <xsl:with-param name='nodeSet' select='@*'/>
        <xsl:with-param name='maxOrd' select='0'/>
      </xsl:call-template>
    </xsl:variable>

    <xsl:call-template name='rdfg:propertyEltStar-6-12'>
      <xsl:with-param name='nodeSet' select='./*'/>
      <xsl:with-param name='subjectType' select='$newSubjectType'/>
      <xsl:with-param name='subjectValu' select='$newSubjectValu'/>
      <xsl:with-param name='bagType' select='$newBagType'/>
      <xsl:with-param name='bagValu' select='$newBagValu'/>
      <xsl:with-param name='maxOrd' select='$propAttrMaxOrd'/>
    </xsl:call-template>
  </xsl:template>

<!-- Production idAboutAttr-6-5 -->

  <xsl:template name='rdfg:idAboutAttr-6-5-Type'>
    <xsl:choose>
      <xsl:when test='@ID and namespace-uri()=$RDFNS'>
        <xsl:value-of select='$URI'/>
      </xsl:when>
      <xsl:when test='@rdf:ID'>
        <xsl:value-of select='$URI'/>
      </xsl:when>
      <xsl:when test='@about and namespace-uri()=$RDFNS'>
        <xsl:value-of select='$URI'/>
      </xsl:when>
      <xsl:when test='@rdf:about'>
        <xsl:value-of select='$URI'/>
      </xsl:when>
      <xsl:when test='@aboutEach and namespace-uri()=$RDFNS'>
        <xsl:value-of select='$URI'/>
      </xsl:when>
      <xsl:when test='@rdf:aboutEach'>
        <xsl:value-of select='$URI'/>
      </xsl:when>
      <xsl:when test='@aboutEachPrefix and namespace-uri()=$RDFNS'>
        <xsl:value-of select='$URI'/>
      </xsl:when>
      <xsl:when test='@rdf:aboutEachPrefix'>
        <xsl:value-of select='$URI'/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select='$ANON'/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template name='rdfg:idAboutAttr-6-5-Valu'>
    <xsl:choose>
      <xsl:when test='@ID and namespace-uri()=$RDFNS'>
        <xsl:value-of select='concat("#", @ID)'/>
      </xsl:when>
      <xsl:when test='@rdf:ID'>
        <xsl:value-of select='concat("#", @rdf:ID)'/>
      </xsl:when>
      <xsl:when test='@about and namespace-uri()=$RDFNS'>
        <xsl:value-of select='@about'/>
      </xsl:when>
      <xsl:when test='@rdf:about'>
        <xsl:value-of select='@rdf:about'/>
      </xsl:when>
      <xsl:when test='@aboutEach and namespace-uri()=$RDFNS'>
        <xsl:value-of select='@aboutEach'/>
      </xsl:when>
      <xsl:when test='@rdf:aboutEach'>
        <xsl:value-of select='@rdf:aboutEach'/>
      </xsl:when>
      <xsl:when test='@aboutEachPrefix and namespace-uri()=$RDFNS'>
        <xsl:value-of select='@aboutEachPrefix'/>
      </xsl:when>
      <xsl:when test='@rdf:aboutEachPrefix'>
        <xsl:value-of select='@rdf:aboutEachPrefix'/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select='concat(generate-id(), "-IA")'/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

<!-- Production bagIdAttr-6-9 -->

  <xsl:template name='rdfg:bagIdAttr-6-9-Type'>
    <xsl:choose>
      <xsl:when test='@bagID and namespace-uri()=$RDFNS'>
        <xsl:value-of select='$URI'/>
      </xsl:when>
      <xsl:when test='@rdf:bagID'>
        <xsl:value-of select='$URI'/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select='$AUTO'/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template name='rdfg:bagIdAttr-6-9-Valu'>
    <xsl:choose>
      <xsl:when test='@bagID and namespace-uri()=$RDFNS'>
        <xsl:value-of select='concat("#", @bagID)'/>
      </xsl:when>
      <xsl:when test='@rdf:bagID'>
        <xsl:value-of select='concat("#", @rdf:bagID)'/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select='concat(generate-id(), "-BID")'/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

<!-- Production 6.10 propAttr* -->

  <xsl:template name='rdfg:propAttrStar-6-10'>
    <xsl:for-each select='$nodeSet'>
      <xsl:call-template name='rdfg:propAttr-6-10'>
        <xsl:with-param name='subjectType' select='$subjectType'/>
        <xsl:with-param name='subjectValu' select='$subjectValu'/>
        <xsl:with-param name='bagType' select='$bagType'/>
        <xsl:with-param name='bagValu' select='bagValu'/>
        <xsl:with-param name='elementNS' select='$elementNS'/>
      </xsl:call-template>
    </xsl:for-each>
  </xsl:template>

  <xsl:template name='rdfg:propAttrMaxOrd'>
    <xsl:choose>
      <xsl:when test='count($nodeSet)>"0"'>
        <xsl:variable name='maxOrd1'>
          <xsl:call-template name='rdfg:incOrd'>
            <xsl:with-param name='ns'
                           
select='namespace-uri($nodeSet[position()="1"])'/>
            <xsl:with-param name='localname'
                           
select='local-name($nodeSet[position()="1"])'/>
            <xsl:with-param name='maxOrd' select='$maxOrd'/>
          </xsl:call-template>
        </xsl:variable>

        <xsl:call-template name='rdfg:propAttrMaxOrd'>
          <xsl:with-param name='nodeSet'
select='$nodeSet[position()!="1"]'/>
          <xsl:with-param name='maxOrd' select='$maxOrd1'/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select='$maxOrd'/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template name='rdfg:propAttr-6-10'>
    <xsl:choose>
      <xsl:when test='name()="xml:lang"
                   or (name()="ID" and $elementNS=$RDFNS)
                   or (namespace-uri()=$RDFNS and local-name()="ID")
                   or (name()="about" and $elementNS=$RDFNS)
                   or (namespace-uri()=$RDFNS and local-name()="about")
                   or (name()="aboutEach" and $elementNS=$RDFNS)
                   or (namespace-uri()=$RDFNS and
local-name()="aboutEach")
                   or (name()="aboutEachPrefix" and $elementNS=$RDFNS) 
                   or (namespace-uri()=$RDFNS and 
                                            
local-name()="aboutEachPrefix")
                   or (name()="resource" and $elementNS=$RDFNS)
                   or (namespace-uri()=$RDFNS and
local-name()="resource")
                   or (name()="bagID" and $elementNS=$RDFNS)
                   or (namespace-uri()=$RDFNS and
local-name()="bagID")'>
      </xsl:when>

      <xsl:when test='(name()="li" and $elementNS=$RDFNS)
                   or (namespace-uri()=$RDFNS and local-name()="li")'>
        <xsl:variable name='stmtType'>
          <xsl:choose>
            <xsl:when test='$bagType=$NONE'>
              <xsl:value-of select='$NONE'/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:value-of select='$ANON'/>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:variable>
        <xsl:variable name='stmtValu'>
          <xsl:value-of select='concat(generate-id(), "-RS")'/>
        </xsl:variable>
        <xsl:call-template name='rdfg:emitTriple'>
          <xsl:with-param name='rsidType' select='$stmtType'/>
          <xsl:with-param name='rsidValu' select='$stmtValu'/>
          <xsl:with-param name='subjectType' select='$subjectType'/>
          <xsl:with-param name='subjectValu' select='$subjectValu'/>
          <xsl:with-param name='ns' select='$RDFNS'/>
          <xsl:with-param name='localname' select='"_1"'/>
          <xsl:with-param name='objectType' select='$LITERAL'/>
          <xsl:with-param name='objectValu' select='string(.)'/>
        </xsl:call-template>
        <xsl:call-template name='rdfg:emitTriple'>
          <xsl:with-param name='rsidType' select='$NONE'/>
          <xsl:with-param name='rsidValu' select='""'/>
          <xsl:with-param name='subjectType' select='$bagType'/>
          <xsl:with-param name='subjectValu' select='$bagValu'/>
          <xsl:with-param name='ns' select='$RDFGNS'/>
          <xsl:with-param name='localname' select='$HASMEMBER'/>
          <xsl:with-param name='objectType' select='$stmtType'/>
          <xsl:with-param name='objectValu' select='$stmtValu'/>
        </xsl:call-template>
      </xsl:when>

      <xsl:when test='(name()="type" and $elementNS=$RDFNS)
                   or (namespace-uri()=$RDFNS and local-name()="type")'>
        <xsl:call-template name='rdfg:typeAttr-6-11'>
          <xsl:with-param name='subjectType' select='$subjectType'/>
          <xsl:with-param name='subjectValu' select='$subjectValu'/>
          <xsl:with-param name='bagType' select='$bagType'/>
          <xsl:with-param name='bagValu' select='$bagValu'/>
        </xsl:call-template>
      </xsl:when>

      <xsl:otherwise>
        <xsl:variable name='stmtType'>
          <xsl:choose>
            <xsl:when test='$bagType=$NONE'>
              <xsl:value-of select='$NONE'/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:value-of select='$ANON'/>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:variable>
        <xsl:variable name='stmtValu'>
          <xsl:value-of select='concat(generate-id(), "-RS")'/>
        </xsl:variable>
        <xsl:call-template name='rdfg:emitTriple'>
          <xsl:with-param name='rsidType' select='$stmtType'/>
          <xsl:with-param name='rsidValu' select='$stmtValu'/>
          <xsl:with-param name='subjectType' select='$subjectType'/>
          <xsl:with-param name='subjectValu' select='$subjectValu'/>
          <xsl:with-param name='ns' select='namespace-uri()'/>
          <xsl:with-param name='localname' select='local-name()'/>
          <xsl:with-param name='objectType' select='$LITERAL'/>
          <xsl:with-param name='objectValu' select='string(.)'/>
        </xsl:call-template>
        <xsl:call-template name='rdfg:emitTriple'>
          <xsl:with-param name='rsidType' select='$NONE'/>
          <xsl:with-param name='rsidValu' select='""'/>
          <xsl:with-param name='subjectType' select='$bagType'/>
          <xsl:with-param name='subjectValu' select='$bagValu'/>
          <xsl:with-param name='ns' select='$RDFGNS'/>
          <xsl:with-param name='localname' select='$HASMEMBER'/>
          <xsl:with-param name='objectType' select='$stmtType'/>
          <xsl:with-param name='objectValu' select='$stmtValu'/>
        </xsl:call-template>
      </xsl:otherwise> 
    </xsl:choose>
  </xsl:template>

<!-- Production 6.11 typeAttr -->

  <xsl:template name='rdfg:typeAttr-6-11'>
    <xsl:variable name='stmtType'>
      <xsl:choose>
        <xsl:when test='$bagType=$NONE'>
          <xsl:value-of select='$NONE'/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select='$ANON'/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <xsl:variable name='stmtValu'>
       <xsl:value-of select='concat(generate-id(), "-RS")'/>
    </xsl:variable>
    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$stmtType'/>
      <xsl:with-param name='rsidValu' select='$stmtValu'/>
      <xsl:with-param name='subjectType' select='$subjectType'/>
      <xsl:with-param name='subjectValu' select='$subjectValu'/>
      <xsl:with-param name='ns' select='$RDFNS'/>
      <xsl:with-param name='localname' select='$TYPE'/>
      <xsl:with-param name='objectType' select='$URI'/>
      <xsl:with-param name='objectValu' select='string(.)'/>
    </xsl:call-template>
    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$NONE'/>
      <xsl:with-param name='rsidValu' select='""'/>
      <xsl:with-param name='subjectType' select='$bagType'/>
      <xsl:with-param name='subjectValu' select='$bagValu'/>
      <xsl:with-param name='ns' select='$RDFGNS'/>
      <xsl:with-param name='localname' select='$HASMEMBER'/>
      <xsl:with-param name='objectType' select='$stmtType'/>
      <xsl:with-param name='objectValu' select='$stmtValu'/>
   </xsl:call-template>
  </xsl:template>

<!-- Production 6.12 propertyElt -->

  <xsl:template name='rdfg:propertyEltStar-6-12'>
    <xsl:if test='count($nodeSet)>"0"'>
      <xsl:for-each select='$nodeSet[position()="1"]'>
        <xsl:call-template name='rdfg:propertyElt-6-12'>
          <xsl:with-param name='subjectType' select='$subjectType'/>
          <xsl:with-param name='subjectValu' select='$subjectValu'/>
          <xsl:with-param name='bagType' select='$bagType'/>
          <xsl:with-param name='bagValu' select='$bagValu'/>
          <xsl:with-param name='maxOrd' select='$maxOrd'/>
        </xsl:call-template>
      </xsl:for-each>

      <xsl:variable name='maxOrd1'>
        <xsl:call-template name='rdfg:incOrd'>
          <xsl:with-param name='ns'
                         
select='namespace-uri($nodeSet[position()="1"])'/>
          <xsl:with-param name='localname'
                         
select='local-name($nodeSet[position()="1"])'/>
          <xsl:with-param name='maxOrd' select='$maxOrd'/>
        </xsl:call-template>
      </xsl:variable>

      <xsl:call-template name='rdfg:propertyEltStar-6-12'>
        <xsl:with-param name='nodeSet'
select='$nodeSet[position()!="1"]'/>
        <xsl:with-param name='subjectType' select='$subjectType'/>
        <xsl:with-param name='subjectValu' select='$subjectValu'/>
        <xsl:with-param name='bagType' select='$bagType'/>
        <xsl:with-param name='bagValu' select='$bagValu'/>
        <xsl:with-param name='maxOrd' select='$maxOrd1'/>
      </xsl:call-template>
    </xsl:if>
 </xsl:template>

  <xsl:template name='rdfg:propertyElt-6-12'>
    <xsl:variable name='parseLiteral'>
      <xsl:call-template name='rdfg:parseLiteral-6-32'/>
    </xsl:variable>
    <xsl:variable name='parseResource'>
      <xsl:call-template name='rdfg:parseResource-6-33'/>
    </xsl:variable>

    <xsl:choose>
      <xsl:when test='$parseLiteral!="Literal"
                  and $parseResource!="Resource"
                  and (./* or text())'>
        <xsl:call-template name='rdfg:p6-12-a'>
          <xsl:with-param name='subjectType' select='$subjectType'/>
          <xsl:with-param name='subjectValu' select='$subjectValu'/>
          <xsl:with-param name='bagType' select='$bagType'/>
          <xsl:with-param name='bagValu' select='$bagValu'/>
          <xsl:with-param name='maxOrd' select='$maxOrd'/>
        </xsl:call-template>
      </xsl:when>

      <xsl:when test='$parseLiteral="Literal"'>
        <xsl:call-template name='rdfg:p6-12-b'>
          <xsl:with-param name='subjectType' select='$subjectType'/>
          <xsl:with-param name='subjectValu' select='$subjectValu'/>
          <xsl:with-param name='bagType' select='$bagType'/>
          <xsl:with-param name='bagValu' select='$bagValu'/>
          <xsl:with-param name='maxOrd' select='$maxOrd'/>
        </xsl:call-template>
      </xsl:when>

      <xsl:when test='$parseResource="Resource"'>
        <xsl:call-template name='rdfg:p6-12-c'>
          <xsl:with-param name='subjectType' select='$subjectType'/>
          <xsl:with-param name='subjectValu' select='$subjectValu'/>
          <xsl:with-param name='bagType' select='$bagType'/>
          <xsl:with-param name='bagValu' select='$bagValu'/>
          <xsl:with-param name='maxOrd' select='$maxOrd'/>
        </xsl:call-template>
      </xsl:when>

      <xsl:when test='not(text() or ./*)'>
        <xsl:call-template name='rdfg:p6-12-d'>
          <xsl:with-param name='subjectType' select='$subjectType'/>
          <xsl:with-param name='subjectValu' select='$subjectValu'/>
          <xsl:with-param name='bagType' select='$bagType'/>
          <xsl:with-param name='bagValu' select='$bagValu'/>
          <xsl:with-param name='maxOrd' select='$maxOrd'/>
        </xsl:call-template>
      </xsl:when>
    </xsl:choose>
 </xsl:template>

  <xsl:template name='rdfg:p6-12-a'>
    <xsl:variable name='rsidAttrType'>
      <xsl:call-template name='rdfg:rsidAttr-6-36-Type'>
        <xsl:with-param name='bagType' select='$bagType'/>
      </xsl:call-template>
    </xsl:variable>
    <xsl:variable name='rsidAttrValu'>
      <xsl:call-template name='rdfg:rsidAttr-6-36-Valu'/>
    </xsl:variable>
    <xsl:variable name='predLN'>
      <xsl:call-template name='rdfg:propName-6-14'>
        <xsl:with-param name='maxOrd' select='$maxOrd'/>
      </xsl:call-template>
    </xsl:variable>

    <xsl:call-template name='rdfg:value-6-17'>
      <xsl:with-param name='subjectType' select='$subjectType'/>
      <xsl:with-param name='subjectValu' select='$subjectValu'/>
      <xsl:with-param name='ns' select='namespace-uri()'/>
      <xsl:with-param name='localname' select='$predLN'/>
      <xsl:with-param name='bagType' select='$bagType'/>
      <xsl:with-param name='bagValu' select='$bagValu'/>
      <xsl:with-param name='rsidType' select='$rsidAttrType'/>
      <xsl:with-param name='rsidValu' select='$rsidAttrValu'/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name='rdfg:p6-12-b'>
    <xsl:variable name='rsidAttrType'>
      <xsl:call-template name='rdfg:rsidAttr-6-36-Type'>
        <xsl:with-param name='bagType' select='$bagType'/>
      </xsl:call-template>
    </xsl:variable>
    <xsl:variable name='rsidAttrValu'>
      <xsl:call-template name='rdfg:rsidAttr-6-36-Valu'/>
    </xsl:variable>
    <xsl:variable name='predLN'>
      <xsl:call-template name='rdfg:propName-6-14'>
        <xsl:with-param name='maxOrd' select='$maxOrd'/>
      </xsl:call-template>
    </xsl:variable>

    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$rsidAttrType'/>
      <xsl:with-param name='rsidValu' select='$rsidAttrValu'/>
      <xsl:with-param name='subjectType' select='$subjectType'/>
      <xsl:with-param name='subjectValu' select='$subjectValu'/>
      <xsl:with-param name='ns' select='namespace-uri()'/>
      <xsl:with-param name='localname' select='$predLN'/>
      <xsl:with-param name='objectType' select='$LITERAL'/>
      <xsl:with-param name='objectValu' select='./*'/>
    </xsl:call-template>
    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$NONE'/>
      <xsl:with-param name='rsidValu' select='""'/>
      <xsl:with-param name='subjectType' select='$bagType'/>
      <xsl:with-param name='subjectValu' select='$bagValu'/>
      <xsl:with-param name='ns' select='$RDFGNS'/>
      <xsl:with-param name='localname' select='$HASMEMBER'/>
      <xsl:with-param name='objectType' select='$rsidAttrType'/>
      <xsl:with-param name='objectValu' select='$rsidAttrValu'/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name='rdfg:p6-12-c'>
    <xsl:variable name='rsidAttrType'>
      <xsl:call-template name='rdfg:rsidAttr-6-36-Type'>
        <xsl:with-param name='bagType' select='$bagType'/>
      </xsl:call-template>
    </xsl:variable>
    <xsl:variable name='rsidAttrValu'>
      <xsl:call-template name='rdfg:rsidAttr-6-36-Valu'/>
    </xsl:variable>
    <xsl:variable name='objectType'>
      <xsl:value-of select='$ANON'/>
    </xsl:variable>
    <xsl:variable name='objectValu'>
      <xsl:value-of select='concat(generate-id(), "-OBJ")'/>
    </xsl:variable>
    <xsl:variable name='predLN'>
      <xsl:call-template name='rdfg:propName-6-14'>
        <xsl:with-param name='maxOrd' select='$maxOrd'/>
      </xsl:call-template>
    </xsl:variable>

    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$rsidAttrType'/>
      <xsl:with-param name='rsidValu' select='$rsidAttrValu'/>
      <xsl:with-param name='subjectType' select='$subjectType'/>
      <xsl:with-param name='subjectValu' select='$subjectValu'/>
      <xsl:with-param name='ns' select='namespace-uri()'/>
      <xsl:with-param name='localname' select='$predLN'/>
      <xsl:with-param name='objectType' select='$objectType'/>
      <xsl:with-param name='objectValu' select='$objectValu'/>
    </xsl:call-template>
    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$NONE'/>
      <xsl:with-param name='rsidValu' select='""'/>
      <xsl:with-param name='subjectType' select='$bagType'/>
      <xsl:with-param name='subjectValu' select='$bagValu'/>
      <xsl:with-param name='ns' select='$RDFGNS'/>
      <xsl:with-param name='localname' select='$HASMEMBER'/>
      <xsl:with-param name='objectType' select='$rsidAttrType'/>
      <xsl:with-param name='objectValu' select='$rsidAttrValu'/>
    </xsl:call-template>

    <xsl:variable name='newBagType'>
      <xsl:value-of select='$AUTO'/>
    </xsl:variable>
    <xsl:variable name='newBagValu'>
      <xsl:value-of select='concat(generate-id(), "-BID")'/> <!-- dodgy
2nd call
                                                              to
generate-id
                                                            -->
    </xsl:variable>
    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$NONE'/>
      <xsl:with-param name='rsidValu' select='""'/>
      <xsl:with-param name='subjectType' select='$newBagType'/>
      <xsl:with-param name='subjectValu' select='$newBagValu'/>
      <xsl:with-param name='ns' select='$RDFNS'/>
      <xsl:with-param name='localname' select='$TYPE'/>
      <xsl:with-param name='objectType' select='$URI'/>
      <xsl:with-param name='objectValu' select='concat($RDFNS, $BAG)'/>
    </xsl:call-template>
    <xsl:call-template name='rdfg:propertyEltStar-6-12'>
      <xsl:with-param name='nodeSet' select='./*'/>
      <xsl:with-param name='subjectType' select='$objectType'/>
      <xsl:with-param name='subjectValu' select='$objectValu'/>
      <xsl:with-param name='bagType' select='$newBagType'/>
      <xsl:with-param name='bagValu' select='$newBagValu'/>
      <xsl:with-param name='maxOrd' select='"0"'/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name='rdfg:p6-12-d'>
    <xsl:variable name='idRefAttrType'>
      <xsl:call-template name='rdfg:idRefAttr-6-16-Type'/>
    </xsl:variable>
    <xsl:variable name='idRefAttrValu'>
      <xsl:call-template name='rdfg:idRefAttr-6-16-Valu'/>
    </xsl:variable>
    <xsl:variable name='stmtType'>
      <xsl:choose>
        <xsl:when test='$bagType=$NONE'>
          <xsl:value-of select='$NONE'/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select='$ANON'/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <xsl:variable name='stmtValu'>
      <xsl:value-of select='concat(generate-id(), "-RS")'/>
    </xsl:variable>

    <xsl:variable name='predLN'>
      <xsl:call-template name='rdfg:propName-6-14'>
        <xsl:with-param name='maxOrd' select='$maxOrd'/>
      </xsl:call-template>
    </xsl:variable>

    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$stmtType'/>
      <xsl:with-param name='rsidValu' select='$stmtValu'/>
      <xsl:with-param name='subjectType' select='$subjectType'/>
      <xsl:with-param name='subjectValu' select='$subjectValu'/>
      <xsl:with-param name='ns' select='namespace-uri()'/>
      <xsl:with-param name='localname' select='$predLN'/>
      <xsl:with-param name='objectType' select='$idRefAttrType'/>
      <xsl:with-param name='objectValu' select='$idRefAttrValu'/>
    </xsl:call-template>
    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$NONE'/>
      <xsl:with-param name='rsidValu' select='""'/>
      <xsl:with-param name='subjectType' select='$bagType'/>
      <xsl:with-param name='subjectValu' select='$bagValu'/>
      <xsl:with-param name='ns' select='$RDFGNS'/>
      <xsl:with-param name='localname' select='$HASMEMBER'/>
      <xsl:with-param name='objectType' select='$stmtType'/>
      <xsl:with-param name='objectValu' select='$stmtValu'/>
    </xsl:call-template>

    <xsl:variable name='newBagType'>
      <xsl:call-template name='rdfg:bagIdAttr-6-9-Type'/>
    </xsl:variable>
    <xsl:variable name='newBagValu'>
      <xsl:call-template name='rdfg:bagIdAttr-6-9-Valu'/>
    </xsl:variable>
    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$NONE'/>
      <xsl:with-param name='rsidValu' select='""'/>
      <xsl:with-param name='subjectType' select='$newBagType'/>
      <xsl:with-param name='subjectValu' select='$newBagValu'/>
      <xsl:with-param name='ns' select='$RDFNS'/>
      <xsl:with-param name='localname' select='$TYPE'/>
      <xsl:with-param name='objectType' select='$URI'/>
      <xsl:with-param name='objectValu' select='concat($RDFNS, $BAG)'/>
    </xsl:call-template>

    <xsl:call-template name='rdfg:propAttrStar-6-10'>
      <xsl:with-param name='nodeSet' select='@*'/>
      <xsl:with-param name='subjectType' select='$idRefAttrType'/>
      <xsl:with-param name='subjectValu' select='$idRefAttrValu'/>
      <xsl:with-param name='bagType' select='$newBagType'/>
      <xsl:with-param name='bagValu' select='$newBagValu'/>
      <xsl:with-param name='elementNS' select='namespace-uri()'/>
    </xsl:call-template>
  </xsl:template>

<!-- Production typedNode 6.13 -->

  <xsl:template name='rdfg:typedNode-6-13'>
    <xsl:choose>
      <xsl:when test='not(./*)'>
        <xsl:call-template name='rdfg:p-6-13a'>
          <xsl:with-param  name='subjectType' select='$subjectType'/>
          <xsl:with-param name='subjectValu' select='$subjectValu'/>
          <xsl:with-param name='ns' select='$ns'/>
          <xsl:with-param name='localname' select='$localname'/>
          <xsl:with-param name='bagType' select='$bagType'/>
          <xsl:with-param name='bagValu' select='$bagValu'/>
          <xsl:with-param name='rsidType' select='$rsidType'/>
          <xsl:with-param name='rsidValu' select='$rsidValu'/>
        </xsl:call-template>
      </xsl:when>

      <xsl:otherwise>
        <xsl:call-template name='rdfg:p-6-13b'>
          <xsl:with-param  name='subjectType' select='$subjectType'/>
          <xsl:with-param name='subjectValu' select='$subjectValu'/>
          <xsl:with-param name='ns' select='$ns'/>
          <xsl:with-param name='localname' select='$localname'/>
          <xsl:with-param name='bagType' select='$bagType'/>
          <xsl:with-param name='bagValu' select='$bagValu'/>
          <xsl:with-param name='rsidType' select='$rsidType'/>
          <xsl:with-param name='rsidValu' select='$rsidValu'/>
        </xsl:call-template>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template name='rdfg:p-6-13a'>
    <xsl:variable name='idAboutAttrType'>
      <xsl:call-template name='rdfg:idAboutAttr-6-5-Type'/>
    </xsl:variable>
    <xsl:variable name='idAboutAttrValu'>
      <xsl:call-template name='rdfg:idAboutAttr-6-5-Valu'/>
    </xsl:variable>
    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$rsidType'/>
      <xsl:with-param name='rsidValu' select='$rsidValu'/>
      <xsl:with-param name='subjectType' select='$subjectType'/>
      <xsl:with-param name='subjectValu' select='$subjectValu'/>
      <xsl:with-param name='ns' select='$ns'/>
      <xsl:with-param name='localname' select='$localname'/>
      <xsl:with-param name='objectType' select='$idAboutAttrType'/>
      <xsl:with-param name='objectValu' select='$idAboutAttrValu'/>
    </xsl:call-template>
    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$NONE'/>
      <xsl:with-param name='rsidValu' select='""'/>
      <xsl:with-param name='subjectType' select='$bagType'/>
      <xsl:with-param name='subjectValu' select='$bagValu'/>
      <xsl:with-param name='ns' select='$RDFGNS'/>
      <xsl:with-param name='localname' select='$HASMEMBER'/>
      <xsl:with-param name='objectType' select='$rsidType'/>
      <xsl:with-param name='objectValu' select='$rsidValu'/>
    </xsl:call-template>

    <xsl:variable name='newBagType'>
      <xsl:call-template name='rdfg:bagIdAttr-6-9-Type'/>
    </xsl:variable>
    <xsl:variable name='newBagValu'>
      <xsl:call-template name='rdfg:bagIdAttr-6-9-Valu'/>
    </xsl:variable>
    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$NONE'/>
      <xsl:with-param name='rsidValu' select='""'/>
      <xsl:with-param name='subjectType' select='$newBagType'/>
      <xsl:with-param name='subjectValu' select='$newBagValu'/>
      <xsl:with-param name='ns' select='$RDFNS'/>
      <xsl:with-param name='localname' select='$TYPE'/>
      <xsl:with-param name='objectType' select='$URI'/>
      <xsl:with-param name='objectValu' select='concat($RDFNS, $BAG)'/>
    </xsl:call-template>

    <xsl:variable name='stmtType'>
      <xsl:choose>
        <xsl:when test='$newBagType=$NONE'>
          <xsl:value-of select='$NONE'/>
        </xsl:when>
        <xsl:otherwise>
           <xsl:value-of select='$ANON'/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <xsl:variable name='stmtValu'>
      <xsl:value-of select='concat(generate-id(), "-RS")'/>
    </xsl:variable>
<foobar/>

    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$stmtType'/>
      <xsl:with-param name='rsidValu' select='$stmtValu'/>
      <xsl:with-param name='subjectType' select='$idAboutAttrType'/>
      <xsl:with-param name='subjectValu' select='$idAboutAttrValu'/>
      <xsl:with-param name='ns' select='$RDFNS'/>
      <xsl:with-param name='localname' select='$TYPE'/>
      <xsl:with-param name='objectType' select='$URI'/>
      <xsl:with-param name='objectValu'
                      select='concat(namespace-uri(), local-name())'/>
    </xsl:call-template>
    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$NONE'/>
      <xsl:with-param name='rsidValu' select='""'/>
      <xsl:with-param name='subjectType' select='$newBagType'/>
      <xsl:with-param name='subjectValu' select='$newBagValu'/>
      <xsl:with-param name='ns' select='$RDFGNS'/>
      <xsl:with-param name='localname' select='$HASMEMBER'/>
      <xsl:with-param name='objectType' select='$stmtType'/>
      <xsl:with-param name='objectValu' select='$stmtValu'/>
    </xsl:call-template>

    <xsl:call-template name='rdfg:propAttrStar-6-10'>
      <xsl:with-param name='nodeSet' select='@*'/>
      <xsl:with-param name='subjectType' select='$idAboutAttrType'/>
      <xsl:with-param name='subjectValu' select='$idAboutAttrValu'/>
      <xsl:with-param name='bagType' select='$newBagType'/>
      <xsl:with-param name='bagValu' select='$newBagValu'/>
      <xsl:with-param name='elementNS' select='namespace-uri()'/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name='rdfg:p-6-13b'> 
    <xsl:variable name='idAboutAttrType'>
      <xsl:call-template name='rdfg:idAboutAttr-6-5-Type'/>
    </xsl:variable>
    <xsl:variable name='idAboutAttrValu'>
      <xsl:call-template name='rdfg:idAboutAttr-6-5-Valu'/>
    </xsl:variable>
    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$rsidType'/>
      <xsl:with-param name='rsidValu' select='$rsidValu'/>
      <xsl:with-param name='subjectType' select='$subjectType'/>
      <xsl:with-param name='subjectValu' select='$subjectValu'/>
      <xsl:with-param name='ns' select='$ns'/>
      <xsl:with-param name='localname' select='$localname'/>
      <xsl:with-param name='objectType' select='$idAboutAttrType'/>
      <xsl:with-param name='objectValu' select='$idAboutAttrValu'/>
    </xsl:call-template>
    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$NONE'/>
      <xsl:with-param name='rsidValu' select='""'/>
      <xsl:with-param name='subjectType' select='$bagType'/>
      <xsl:with-param name='subjectValu' select='$bagValu'/>
      <xsl:with-param name='ns' select='$RDFGNS'/>
      <xsl:with-param name='localname' select='$HASMEMBER'/>
      <xsl:with-param name='objectType' select='$rsidType'/>
      <xsl:with-param name='objectValu' select='$rsidValu'/>
    </xsl:call-template>

    <xsl:variable name='newBagType'>
      <xsl:call-template name='rdfg:bagIdAttr-6-9-Type'/>
    </xsl:variable>
    <xsl:variable name='newBagValu'>
      <xsl:call-template name='rdfg:bagIdAttr-6-9-Valu'/>
    </xsl:variable>
    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$NONE'/>
      <xsl:with-param name='rsidValu' select='""'/>
      <xsl:with-param name='subjectType' select='$newBagType'/>
      <xsl:with-param name='subjectValu' select='$newBagValu'/>
      <xsl:with-param name='ns' select='$RDFNS'/>
      <xsl:with-param name='localname' select='$TYPE'/>
      <xsl:with-param name='objectType' select='$URI'/>
      <xsl:with-param name='objectValu' select='concat($RDFNS, $BAG)'/>
    </xsl:call-template>

    <xsl:variable name='stmtType'>
      <xsl:choose>
        <xsl:when test='$newBagType=$NONE'>
          <xsl:value-of select='$NONE'/>
        </xsl:when>
        <xsl:otherwise>
           <xsl:value-of select='$ANON'/>
         </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <xsl:variable name='stmtValu'>
      <xsl:value-of select='concat(generate-id(), "-RS")'/>
    </xsl:variable>

    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$stmtType'/>
      <xsl:with-param name='rsidValu' select='$stmtValu'/>
      <xsl:with-param name='subjectType' select='$idAboutAttrType'/>
      <xsl:with-param name='subjectValu' select='$idAboutAttrValu'/>
      <xsl:with-param name='ns' select='$RDFNS'/>
      <xsl:with-param name='localname' select='$TYPE'/>
      <xsl:with-param name='objectType' select='$URI'/>
      <xsl:with-param name='objectValu' 
                      select='concat(namespace-uri(), local-name())'/>
    </xsl:call-template>
    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$NONE'/>
      <xsl:with-param name='rsidValu' select='""'/>
      <xsl:with-param name='subjectType' select='$newBagType'/>
      <xsl:with-param name='subjectValu' select='$newBagValu'/>
      <xsl:with-param name='ns' select='$RDFGNS'/>
      <xsl:with-param name='localname' select='$HASMEMBER'/>
      <xsl:with-param name='objectType' select='$stmtType'/>
      <xsl:with-param name='objectValu' select='$stmtValu'/>
    </xsl:call-template>

    <xsl:call-template name='rdfg:propAttrStar-6-10'>
      <xsl:with-param name='nodeSet' select='@*'/>
      <xsl:with-param name='subjectType' select='$idAboutAttrType'/>
      <xsl:with-param name='subjectValu' select='$idAboutAttrValu'/>
      <xsl:with-param name='bagType' select='$newBagType'/> <!--@@??-->
      <xsl:with-param name='bagValu' select='$newBagValu'/> <!--@@??-->
      <xsl:with-param name='elementNS' select='namespace-uri()'/>
    </xsl:call-template>

    <xsl:variable name='propAttrStarMaxOrd'>
      <xsl:call-template name='rdfg:propAttrMaxOrd'>
        <xsl:with-param name='nodeSet' select='@*'/>
        <xsl:with-param name='maxOrd' select='"0"'/>
      </xsl:call-template>
    </xsl:variable>

    <xsl:call-template name='rdfg:propertyEltStar-6-12'>
      <xsl:with-param name='nodeSet' select='./*'/>
      <xsl:with-param name='subjectType' select='$idAboutAttrType'/>
      <xsl:with-param name='subjectValu' select='$idAboutAttrValu'/>
      <xsl:with-param name='bagType' select='$newBagType'/> <!-- @@????
-->
      <xsl:with-param name='bagValu' select='$newBagValu'/>
      <xsl:with-param name='maxOrd' select='$propAttrStarMaxOrd'/>
    </xsl:call-template>
  </xsl:template>

<!-- Production propName 6.14 -->

  <xsl:template name='rdfg:propName-6-14'>
    <xsl:choose>
      <xsl:when test='namespace-uri()=$RDFNS and local-name()="li"'>
        <xsl:value-of select='concat("_", $maxOrd + 1)'/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select='local-name()'/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

<!-- Production idRefAttr 6.16 -->

  <xsl:template name='rdfg:idRefAttr-6-16-Type'>
    <xsl:choose>
      <xsl:when test='@rdf:ID'>
        <xsl:value-of select='$URI'/>
      </xsl:when>

      <xsl:when test='namespace-uri()=$RDFNS and @ID'>
        <xsl:value-of select='$URI'/>
      </xsl:when>

      <xsl:when test='@rdf:resource'>
        <xsl:value-of select='$URI'/>
      </xsl:when>

      <xsl:when test='namespace-uri()=$RDFNS and @resource'>
        <xsl:value-of select='$URI'/>
      </xsl:when>

      <xsl:otherwise>
        <xsl:value-of select='$ANON'/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template name='rdfg:idRefAttr-6-16-Valu'>
    <xsl:choose>
      <xsl:when test='@rdf:ID'>
        <xsl:value-of select='@rdf:ID'/>
      </xsl:when>

      <xsl:when test='namespace-uri()=$RDFNS and @ID'>
        <xsl:value-of select='@ID'/>
      </xsl:when>

      <xsl:when test='@rdf:resource'>
        <xsl:value-of select='@rdf:resource'/>
      </xsl:when>

      <xsl:when test='namespace-uri()=$RDFNS and @resource'>
        <xsl:value-of select='@resource'/>
      </xsl:when>

      <xsl:otherwise>
        <xsl:value-of select='concat(generate-id(), "-IDR")'/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

<!-- Production value 6.17 -->

  <xsl:template name='rdfg:value-6-17'>
    <xsl:choose>
      <xsl:when test='./*'>
        <xsl:call-template name='rdfg:p6-17a'>
          <xsl:with-param name='subjectType' select='$subjectType'/>
          <xsl:with-param name='subjectValu' select='$subjectValu'/>
          <xsl:with-param name='ns' select='$ns'/>
          <xsl:with-param name='localname' select='$localname'/>
          <xsl:with-param name='bagType' select='$bagType'/>
          <xsl:with-param name='bagValu' select='$bagValu'/>
          <xsl:with-param name='rsidType' select='$rsidType'/>
          <xsl:with-param name='rsidValu' select='$rsidValu'/>
        </xsl:call-template>
      </xsl:when>

      <xsl:when test='text()'>
        <xsl:call-template name='rdfg:p6-17b'>
          <xsl:with-param name='subjectType' select='$subjectType'/>
          <xsl:with-param name='subjectValu' select='$subjectValu'/>
          <xsl:with-param name='ns' select='$ns'/>
          <xsl:with-param name='localname' select='$localname'/>
          <xsl:with-param name='bagType' select='$bagType'/>
          <xsl:with-param name='bagValu' select='$bagValu'/>
          <xsl:with-param name='rsidType' select='$rsidType'/>
          <xsl:with-param name='rsidValu' select='$rsidValu'/>
        </xsl:call-template>
      </xsl:when>

    </xsl:choose>
  </xsl:template>

  <xsl:template name='rdfg:p6-17a'>
    <xsl:for-each select='./*'>
      <xsl:call-template name='obj-6-2'>
        <xsl:with-param name='subjectType' select='$subjectType'/>
        <xsl:with-param name='subjectValu' select='$subjectValu'/>
        <xsl:with-param name='ns' select='$ns'/>
        <xsl:with-param name='localname' select='$localname'/>
        <xsl:with-param name='bagType' select='$bagType'/>
        <xsl:with-param name='bagValu' select='$bagValu'/>
        <xsl:with-param name='rsidType' select='$rsidType'/>
        <xsl:with-param name='rsidValu' select='$rsidValu'/>
      </xsl:call-template>
    </xsl:for-each>
  </xsl:template>

  <xsl:template name='rdfg:p6-17b'>
    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$rsidType'/>
      <xsl:with-param name='rsidValu' select='$rsidValu'/>
      <xsl:with-param name='subjectType' select='$subjectType'/>
      <xsl:with-param name='subjectValu' select='$subjectValu'/>
      <xsl:with-param name='ns' select='$ns'/>
      <xsl:with-param name='localname' select='$localname'/>
      <xsl:with-param name='objectType' select='$LITERAL'/>
      <xsl:with-param name='objectValu' select='text()'/>
    </xsl:call-template>
    <xsl:call-template name='rdfg:emitTriple'>
      <xsl:with-param name='rsidType' select='$NONE'/>
      <xsl:with-param name='rsidValu' select='""'/>
      <xsl:with-param name='subjectType' select='$bagType'/>
      <xsl:with-param name='subjectValu' select='$bagValu'/>
      <xsl:with-param name='ns' select='$RDFGNS'/>
      <xsl:with-param name='localname' select='$HASMEMBER'/>
      <xsl:with-param name='objectType' select='$rsidType'/>
      <xsl:with-param name='objectValu' select='$rsidValu'/>
    </xsl:call-template>
  </xsl:template>

<!-- Production parseLiteral 6.32 -->

  <xsl:template name='rdfg:parseLiteral-6-32'>
    <xsl:choose>
      <xsl:when test='(@parseType="Literal" and namespace-uri()=$RDFNS)
                  or  @rdf:parseType="Literal"'>Literal</xsl:when>
      <xsl:otherwise/>
    </xsl:choose>
  </xsl:template>


<!-- Production parseResource 6.33 -->

  <xsl:template name='rdfg:parseResource-6-33'>
    <xsl:choose>
      <xsl:when test='(@parseType="Resource" and namespace-uri()=$RDFNS)
                  or  @rdf:parseType="Resource"'>Resource</xsl:when>
      <xsl:otherwise/>
    </xsl:choose>
  </xsl:template>

<!-- Production rsidAttr 6.36 -->

  <xsl:template name='rdfg:rsidAttr-6-36-Type'>
    <xsl:choose>
      <xsl:when test='@rdf:ID'>
        <xsl:value-of select='$URI'/>
      </xsl:when>

      <xsl:when test='namespace-uri()=$RDFNS and @ID'>
        <xsl:value-of select='$URI'/>
      </xsl:when>

      <xsl:otherwise>
        <xsl:choose>
          <xsl:when test='$bagType=$NONE'>
            <xsl:value-of select='$NONE'/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select='$ANON'/>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template name='rdfg:rsidAttr-6-36-Valu'>
    <xsl:choose>
      <xsl:when test='@rdf:ID'>
        <xsl:value-of select='concat("#", @rdf:ID)'/>
      </xsl:when>

      <xsl:when test='namespace-uri()=$RDFNS and @ID'>
        <xsl:value-of select='concat("#", @ID)'/>
      </xsl:when>

      <xsl:otherwise>
        <xsl:value-of select='concat(generate-id(), "-RS")'/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

<!-- output a statement -->

  <xsl:template name='rdfg:emitTriple'>
    <xsl:if test='$subjectType != $NONE'>
      <xsl:element name='statement'>
        <xsl:attribute name='{concat("subj", $subjectType)}'>
          <xsl:value-of select='$subjectValu'/>
        </xsl:attribute>

        <xsl:attribute name='ns'>
          <xsl:value-of select='$ns'/>
        </xsl:attribute>

        <xsl:attribute name='localname'>
          <xsl:value-of select='$localname'/>
        </xsl:attribute>

        <xsl:choose>
          <xsl:when test='$objectType=$LITERAL'>
            <xsl:copy-of select='$objectValu'/>
          </xsl:when>
          <xsl:when test='$objectType=$ANON or $objectType=$URI'>
            <xsl:attribute name='{concat("obj", $objectType)}'>
              <xsl:value-of select='$objectValu'/>
            </xsl:attribute>
          </xsl:when>
        </xsl:choose>
      </xsl:element>
    </xsl:if>

<!-- output the reified statement -->

    <xsl:if test='$rsidType != $NONE'>
      <xsl:element name='statement'>
        <xsl:attribute name='{concat("subj", $rsidType)}'>
          <xsl:value-of select='$rsidValu'/>
        </xsl:attribute>
        <xsl:attribute name='ns'>
          <xsl:value-of select='$RDFNS'/>
        </xsl:attribute>
        <xsl:attribute name='localname'>type</xsl:attribute>
        <xsl:attribute name='{concat("obj",$URI)}'>
          <xsl:value-of select='concat($RDFNS, "Statement")'/>
        </xsl:attribute> 
      </xsl:element>
      <xsl:element name='statement'>
        <xsl:attribute name='{concat("subj", $rsidType)}'>
          <xsl:value-of select='$rsidValu'/>
        </xsl:attribute>
        <xsl:attribute name='ns'>
          <xsl:value-of select='$RDFNS'/>
        </xsl:attribute>
        <xsl:attribute name='localname'>subject</xsl:attribute>
        <xsl:attribute name='{concat("obj",$subjectType)}'>
          <xsl:value-of select='$subjectValu'/>
        </xsl:attribute> 
      </xsl:element>
      <xsl:element name='statement'>
        <xsl:attribute name='{concat("subj", $rsidType)}'>
          <xsl:value-of select='$rsidValu'/>
        </xsl:attribute>
        <xsl:attribute name='ns'>
          <xsl:value-of select='$RDFNS'/>
        </xsl:attribute>
        <xsl:attribute name='localname'>predicate</xsl:attribute>
        <xsl:attribute name='{concat("obj",$URI)}'>
          <xsl:value-of select='concat($ns, $localname)'/>
        </xsl:attribute> 
      </xsl:element>
      <xsl:element name='statement'>
        <xsl:attribute name='{concat("subj", $rsidType)}'>
          <xsl:value-of select='$rsidValu'/>
        </xsl:attribute>
        <xsl:attribute name='ns'>
          <xsl:value-of select='$RDFNS'/>
        </xsl:attribute>
        <xsl:attribute name='localname'>object</xsl:attribute>
        <xsl:choose>
          <xsl:when test='$objectType=$LITERAL'>
            <xsl:copy-of select='$objectValu'/>
          </xsl:when>
          <xsl:when test='$objectType=$ANON or $objectType=$URI'>
            <xsl:attribute name='{concat("obj", $objectType)}'>
              <xsl:value-of select='$objectValu'/>
            </xsl:attribute>
          </xsl:when>
        </xsl:choose>
      </xsl:element>
    </xsl:if>
  </xsl:template>

<!-- function to determine whether max ord has increased -->

  <xsl:template name='rdfg:incOrd'>  <!-- @@TODO what if namespace
missing -->
    <xsl:choose>
      <xsl:when test='$ns = $RDFNS and substring($localname,1,1)="_"'>
        <xsl:variable name='n'>
          <xsl:value-of select='number(substring($localname,2))'/>
        </xsl:variable>
        <xsl:choose>
          <xsl:when test='round($n)=$n and $n>number($maxOrd)'>
            <xsl:value-of select='$n'/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select='$maxOrd'/>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:when>
      <xsl:when test='$ns=$RDFNS and $localname="li"'>
        <xsl:value-of select='$maxOrd + 1'/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select='$maxOrd'/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

Received on Saturday, 14 April 2001 05:33:04 UTC