Public identifiers, parsing

You can parse an SGML/XML public identifier into its constituent parts using the following pattern, written here as a find rule.

  find (  "+//" any ** => registered-owner-identifier "//" 
        | "-//" any ** => unregistered-owner-identifier "//" 
        | any ** => iso-owner-identifier "//")
     any ** => public-text-class " "
     ("-//" => unavailable-text-indicator)?
     any ** => public-text-description "//"
     (letter{2} => public-text-language value-end 
      | ((any ** => public-text-designating-sequence ("//" | value-end))
         (any* => public-text-display-version)?))
In this pattern, the following pattern variables may or may not be specified, depending on the public identifier being scanned:
  • registered-owner-identifier,
  • unregistered-owner-identifier,
  • iso-owner-identifier,
  • unavailable-text-indicator,
  • public-text-language,
  • public-text-designating-sequence, and
  • public-text-display-version;
for this reason, it is best to guard their uses with is specified.