Commit 076d027f authored by david's avatar david

Revision: cxml--devel--1.0--base-0

Archive: david@knowledgetools.de--cxml
Creator: David Lichteblau <david@knowledgetools.de>
Date: Wed Jan  7 14:06:22 CET 2004
Standard-date: 2004-01-07 13:06:22 GMT
Summary: Import of Closure's src/xml and src/glisp (doesn't work yet)
New-files: cxml.asd glisp/dep-acl.lisp glisp/dep-acl5.lisp
    glisp/dep-clisp.lisp glisp/dep-cmucl-dtc.lisp
    glisp/dep-cmucl.lisp glisp/dep-gcl-2.lisp
    glisp/dep-gcl.lisp glisp/dep-sbcl.lisp glisp/gendep.lisp
    glisp/match.lisp glisp/package.lisp glisp/runes.lisp
    glisp/util.lisp xml/dom-builder.lisp xml/dom-impl.lisp
    xml/dompack.lisp xml/encodings-data.lisp
    xml/encodings.lisp xml/package.lisp xml/sax-handler.lisp
    xml/sax-tests/event-collecting-handler.lisp
    xml/sax-tests/package.lisp xml/sax-tests/tests.lisp
    xml/xml-canonic.lisp xml/xml-name-rune-p.lisp
    xml/xml-parse.lisp xml/xml-stream.lisp
New-patches: david@knowledgetools.de--cxml/cxml--devel--1.0--base-0

Import of Closure's src/xml and src/glisp (doesn't work yet)
parent d967327e
--- orig/xml/xml-parse.lisp
+++ mod/xml/xml-parse.lisp
@@ -525,7 +525,10 @@
(declaim (type (simple-array rune (*))
*scratch-pad* *scratch-pad-2* *scratch-pad-3* *scratch-pad-4*))
-(defmacro with-scratch-pads (() &body body)
+(defmacro with-scratch-pads (#-clisp ()
+ ;; clisp does not allow () as macro argument list
+ #+clisp (&key &allow-other-keys)
+ &body body)
`(let ((*scratch-pad* (make-array 1024 :element-type 'rune))
(*scratch-pad-2* (make-array 1024 :element-type 'rune))
(*scratch-pad-3* (make-array 1024 :element-type 'rune))
all:
@echo no such target
@exit 1
.PHONY: clean
clean:
touch dummy.fasl
find . \( -name \*.fasl -o -name \*.x86f \) -print0 | xargs -0 rm
Changes to Gilbert Baumann's Code
========================================
(Stand dieser Liste: patch-54)
base-0
Import of Closure's src/xml and src/glisp
Build system
----------------
patch-14
dom-builder.lsp braucht package.lisp
patch-17
xml-parse braucht dom-impl
patch-18
xml-parse braucht encodings
patch-19
xml-parse.lisp needs xml-stream.lisp
Interface changes
----------------
patch-2
export UNPARSE-DOCUMENT
Portability issues
----------------
patch-1
ACL port aktualisiert
patch-8
fixed more mlisp breakage
DOM fixes
----------------
patch-3
add dom:remove-child, dom:import-node
patch-6
fixed dom:remove-child
patch-7
strings->rods in set-attribute, too
patch-21
dom:item und dom:length fuer NodeList implementiert
patch-22
s/remove-atttribute/remove-attribute
patch-23
dom:remove-attribute-node korrigiert
patch-24
neu: dom:remove-attribute
patch-25
dom:normalize implementiert
patch-26
get-elements-by-tag-name fuer Element implementiert
patch-32
s/data/value/ fuer CHARACTER-DATA
patch-33
Aufruf von Setter-Methoden
patch-34
(setf value) nachgetragen
patch-35
(DOM:NODE-VALUE ATTRIBUTE) korrigiert
patch-36
writer fuer DOM:DATA
patch-37
(setf dom:node-value) implementiert
patch-43
hack: implemented CHILD-NODES for ENTITY-REFERENCE
patch-44
ENTITY-REFERENCE-Kinder als read-only markieren
patch-45
DOM-EXCEPTION implementiert
patch-46
fixed special cases in delete-data and replace-data
patch-47
delete-data: Arraytyp korrigiert
patch-48
DOM:INSERT-DATA implementiert
patch-49
bugfix: replace-data for count != (length arg)
patch-50
patch-46 nachgebessert: offset == length ist OK
patch-51
fixed special cases in dom:substring-data
patch-52
fixed patch-36, my (setf dom:data) implementation was bogus
xml-parse.lisp changes
----------------
patch-5
(assert (eql initial-speed 1)) in make-xstream
patch-20
added a forward declaration for *namespace-bindings*
patch-39
fix for thread safety in p/document
patch-41
Warnung ueber (nicht) redefinierte Attribute abschalten koennen
patch-54
call sax:comment; create comment nodes
String-Handling
----------------
patch-4
renamed dom to cdom, added string-dom
patch-38
diverse setter nachgetragen
Misc.
----------------
patch-9
print elements with their tag-name
patch-11
print attributes with name and value
patch-10
(reverted by patch-10)
patch-12
REVERT patch-10
domtest.cl
----------------
patch-27
alle DOM Level 1 CORE Tests uebersetzen koennen (mehr schlecht als recht)
patch-28
so, jetzt kompilieren die DOM-Tests auch (wenngleich zwei drittel noch fehlschlagen)
patch-29
einzelnen Test ausfuehren koennen
patch-30
<length/> workaround
patch-31
<equals/> fuer nicht-Strings
patch-40
?
patch-42
implementationAttribute-Probleme zwar ausgeben, aber kein WARN machen
patch-53
domtest fixes fuer <var/> und <nodeType>
xmlconf.cl
----------------
patch-13
Testfunktion fuer XML Conformance Test Suite
patch-15
run only tests for namespace-aware XML-1.0 parsers
patch-16
mit korrektem OUTPUT abgleichen
Changes to Gilbert Baumann's Code
========================================
(Stand dieser Liste: patch-190)
base-0
Import of Closure's src/xml and src/glisp
Build system
----------------
patch-14
dom-builder.lsp braucht package.lisp
patch-17
xml-parse braucht dom-impl
patch-18
xml-parse braucht encodings
patch-19
xml-parse.lisp needs xml-stream.lisp
patch-157
DOM in eigenes Verzeichnis und System verschoben
patch-158
COPYING auch im DOM
patch-160
tests in eigenes Verzeichnis verschoben
patch-184
commented out most of dep-clisp for now
patch-185
CLISP fixes
glisp durch runes ersetzt
----------------
patch-139 patch-140 patch-141 patch-142 patch-143
unbenutzte Funktionen aus glisp entfernt
GLISP keine COMMON-LISP-Symbole mehr exportieren lassen
glisp defpackage weiter vereinfacht
patch-148
runes.lisp aufgeteilt in runes.lisp und syntax.lisp
patch-149
CHARACTER-basierte Runen-Implementation
patch-150
removed support for oldish gcl
patch-151
removed dep-gcl-2.lisp
patch-152
clarified glisp license as LLGPL as per Gilbert Baumann
patch-155
GLISP in RUNES umbenannt
patch-156
xstream (und encoding) nach runes verschoben
patch-178
patch-180
really fixed rune-char
DOM fixes
----------------
patch-3
add dom:remove-child, dom:import-node
patch-6
fixed dom:remove-child
patch-7
strings->rods in set-attribute, too
patch-21
dom:item und dom:length fuer NodeList implementiert
patch-22
s/remove-atttribute/remove-attribute
patch-23
dom:remove-attribute-node korrigiert
patch-24
neu: dom:remove-attribute
patch-25
dom:normalize implementiert
patch-26
get-elements-by-tag-name fuer Element implementiert
patch-32
s/data/value/ fuer CHARACTER-DATA
patch-33
Aufruf von Setter-Methoden
patch-34
(setf value) nachgetragen
patch-35
(DOM:NODE-VALUE ATTRIBUTE) korrigiert
patch-36
writer fuer DOM:DATA
patch-37
(setf dom:node-value) implementiert
patch-43
hack: implemented CHILD-NODES for ENTITY-REFERENCE
patch-44
ENTITY-REFERENCE-Kinder als read-only markieren
patch-45
DOM-EXCEPTION implementiert
patch-46
fixed special cases in delete-data and replace-data
patch-47
delete-data: Arraytyp korrigiert
patch-48
DOM:INSERT-DATA implementiert
patch-49
bugfix: replace-data for count != (length arg)
patch-50
patch-46 nachgebessert: offset == length ist OK
patch-51
fixed special cases in dom:substring-data
patch-52
fixed patch-36, my (setf dom:data) implementation was bogus
patch-55
temporary fix: attributes are created with value ""
patch-58
START-DTD, END-DTD, DOCUMENT-TYPE initialisation
patch-60
neu: CLONE-NODE
patch-65, patch-66
verify attribute name syntax in createAttribute
patch-67
more NAME syntax checks: CREATE-ELEMENT, SET-ATTRIBUTE
patch-68
CREATE-ATTRIBUTE: set SPECIFIED to true
patch-69, patch-70
INUSE_ATTRIBUTE_ERR
patch-71
hacked my resolve-entity function to return NIL for undefined entities
patch-72
INVALID_CHARACTER_ERR in create-entity-reference, too
patch-73
Implement no-op methods on (setf node-value) where required...
patch-74
fixed get-elements-by-tag-name not to include the argument itself
patch-76, patch-77
implemented DOM:SPLIT-TEXT
patch-80
noch unfertig: initialisiere dom:enitities richtig, erzeuge Entity-Knoten
patch-82
dom:notations fuellen
patch-85
WRONG_DOCUMENT_ERR auch in set-attribute-node
patch-86
WRONG_DOCUMENT_ERR nicht nur in set-attribute-node, sondern prinzipiell in set-named-item
patch-91
:NOT_FOUND_ERR in remove-named-item
patch-94
can-adopt-p implementiert
patch-95
ENSURE-VALID-INSERTION-REQUEST korrigiert
patch-96
normalize korrigiert: cdata-section nicht beruehren
patch-98
DOCUMENTs have owner NIL
patch-101
(setf dom:data) fuer PI korrigiert
patch-102
NOT_FOUND_ERR in REMOVE-CHILD
patch-104
oops, split-text korrigiert
patch-106
NOT_FOUND_ERROR in removeAttributeNode sucht das Objekt, nicht seinen Namen
patch-107, patch-113
Defaultwert fuer fehlende Attribute ist der leere Rod-String, nicht NIL
patch-118
entity und notation maps sind read-only
patch-119
dom:item liefert NIL bei ungueltigem index
patch-120, patch-122, patch-124
NodeList reimplementiert
patch-121
NAMED-NODE-MAP muss auch auf HIERARCHY_REQUEST_ERR pruefen...
patch-128
ATTRIBUTE hat jetzt Kinder
patch-129
auch Attribute normalisieren
patch-130
(setf dom:value) auf einem Attribut darf ein etwaiges Kinderobjekt nicht wiederverwenden
patch-131
replace-child fuer document-fragment implementiert
patch-132
CAN-ADOPT-P fuer Parent ATTRIBUTE und Kind CDATA-SECTION korrigiert
patch-133
DOCUMENT darf nur jeweils ein ELEMENT- und DOCTYPE-Kind haben
patch-137
neu: map-node-list, do-node-list. ensure-valid-insertion-request korrigiert
patch-165
ANSI conformance fix in MOVE
patch-181
ignore fill-pointers in MOVE
xml-parse.lisp changes
----------------
patch-5
(assert (eql initial-speed 1)) in make-xstream
patch-20
added a forward declaration for *namespace-bindings*
patch-39
fix for thread safety in p/document
patch-41
Warnung ueber (nicht) redefinierte Attribute abschalten koennen
patch-54
call sax:comment; create comment nodes
patch-89
public-id und system-id der Entities uebergeben
patch-100
Die XML Deklaration ist keine Processing Instruction.
patch-146
SAX-Aufrufe korrigiert fuer DTD ohne ID; Entitydeklaration mit SYSTEM ID
patch-166
added missing format argument in internal-entity-expansion
patch-172
fixed rod type in appenddata
patch-174
reordered definitions to avoid forward references
patch-177
more SBCL warnings removed
patch-188
new function parse-octets
(See also: patch-58, patch-80, patch-82)
DOM-Builder und SAX-Interface
----------------
patch-57
Warnungen beseitigt ("undefined variable")
patch-75
fixed PARENT slot initialization and added a rant about the current implementation
patch-97
CDATA sections bauen
patch-136
normalisierte Elemente bauen
(See also: patch-58, patch-80, patch-82, patch-86, patch-118, patch-120)
unparse
----------------
patch-2
export UNPARSE-DOCUMENT
patch-144
Kommentare verstehen (und nicht ausgeben)
patch-189
new function UNPARSE-DOCUMENT-TO-OCTETS
Misc.
----------------
patch-9
print elements with their tag-name
patch-11
print attributes with name and value
patch-138
workaround, need to revert this later
patch-10 reverted by patch-12
patch-114 reverted by patch-115
patch-63 reverted by patch-134
patch-4 patch-38 patch-87 patch-90 patch-103 reverted by patch-154
patch-154 STRING-DOM nicht mehr verwenden. File ist aber noch da.
domtest.cl
----------------
patch-27 patch-28 patch-29 patch-30 patch-31 patch-40 patch-42 patch-53
patch-59 patch-61 patch-62 patch-64 patch-78 patch-79 patch-83 patch-84
patch-88 patch-92 patch-93 patch-99 patch-105 patch-108 patch-111
patch-116 patch-117 patch-123 patch-153 patch-182
DOM tests
xmlconf.cl
----------------
patch-13 patch-15 patch-16 patch-147 patch-186
Testfunktion fuer XML Conformance Test Suite
(need to merge this with Gilbert's work)
<html>
<body>
<h1>Closure XML Parser</h1>
<p>An XML parser written in Common Lisp.</p>
<p>
Closure XML was written by <a
href="http://www.stud.uni-karlsruhe.de/~unk6/">Gilbert Baumann</a>
(unk6 at rz.uni-karlsruhe.de) as part of the Closure web
browser.<br>
Contributions to the parser by
<ul>
<li>
Henrik Motakef (hmot at henrik-motakef.de)<br>
(SAX layer; namespace support)
</li>
<li>
David Lichteblau at knowledgeTools &lt;david@knowledgetools.de&gt;<br>
(conversion into an independent package; DOM bug fixing)
</li>
</ul>
</p>
<p>
<h2>CXML Modules</h2>
CXML provides three packages:
<ul>
<li>
<tt>RUNES</tt>, a portable implementation of Unicode strings.
</li>
<li>
<tt>XML</tt>, a namespace-aware SAX parser implementing the <a
href="http://www.w3.org/TR/2000/REC-xml-20001006">XML 1.0
specification</a>.
</li>
<li>
<tt>DOM</tt>, an implementation of the <a
href="http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html">DOM
Level 1 Core</a> interfaces.
</li>
</ul>
</p>
<p>
<h2>Installation</h2>
<b>Prerequisites.</b> CXML is written in Common Lisp and should be
portable to all Common Lisp implementations.&nbsp; Currently known
to work are ACL, SBCL, CMUCL, and CLISP. (<i>fixme</i>: check
this list)
</p>
</p>
<a href="http://www.cliki.net/asdf">ASDF</a> is used for
compilation. These instructions assume that ASDF has already been
loaded. (Some Lisps include ASDF, for example SBCL and any Lisp
on Debian and Gentoo. For other Lisps please load asdf.lisp
manually before proceeding.)
</p>
<p>
<b>Configuration (optional).</b>
CXML has full Unicode code support -- even on Lisps without
Unicode strings. On non-unicode aware Lisps, <tt>DOMString</tt>
is implemented as an array of character codes. If your Lisp
supports 16 bit characters natively, you can enable feature
<tt>RUNE-IS-CHARACTER</tt> to select an alternative
<tt>DOMString</tt> implementatation, which uses real characters
instead of characters codes.
<pre> * (pushnew :rune-is-character *features*)</pre>
</p>
<p>
<b>Compiling and loading CXML.</b>
Register the .asd file, e.g. by symlinking it:
<pre> $ ln -sf `pwd`/cxms.asd /path/to/your/registry</pre>
Compile CXML using:
<pre> * (asdf:operate 'asdf:load-op :cxml)</pre>
</p>
<p>
<h2>Tests</h2>
Check out the XML and DOM testsuites:
<pre> $ export CVSROOT=:pserver:anonymous@dev.w3.org:/sources/public
$ cvs login # password is "anonymous"
$ cvs co 2001/XML-Test-Suite/xmlconf
$ cvs co 2001/DOM-Test-Suite</pre>
Run all applicable tests using:
<pre> * (xmlconf:run-all-tests "/path/to/2001/XML-Test-Suite/xmlconf/")
* (domtest:run-all-tests "/path/to/2001/2001/DOM-Test-Suite/")</pre>
(As always in Lisp, the trailing slash is significant.)
<p>
</p>
<i>fixme</i>: Add an explanation of xml/sax-tests here.
</p>
</body>
</html>
Time required for parsing a simple document (wc: 99621 298859 3267087).
;; CXML with NIL builder
;; (cxml:parse-file "~/test.xml" nil)
; cpu time (non-gc) 12,940 msec user, 20 msec system
; cpu time (gc) 0 msec user, 0 msec system
; cpu time (total) 12,940 msec user, 20 msec system
; real time 12,991 msec
; space allocation:
; 4,184,599 cons cells, 47,682,392 other bytes, 0 static bytes
;; CXML with xmls-compatible builder
;; (cxml:parse-file "~/test.xml" (cxml-xmls:make-xmls-builder))
; cpu time (non-gc) 14,370 msec user, 20 msec system
; cpu time (gc) 0 msec user, 0 msec system
; cpu time (total) 14,370 msec user, 20 msec system
; real time 14,387 msec
; space allocation:
; 8,667,564 cons cells, 47,682,600 other bytes, 0 static bytes
;; For comparison: xmls.lisp
;; (with-open-file (s "~/test.xml") (xmls:parse s :compress-whitespace nil))
; cpu time (non-gc) 27,440 msec user, 50 msec system
; cpu time (gc) 860 msec user, 0 msec system
; cpu time (total) 28,300 msec user, 50 msec system
; real time 28,813 msec
; space allocation:
; 14,821,161 cons cells, 243,886,592 other bytes, 0 static bytes
;; CXML with DOM builder
;; (cxml:parse-file "~/test.xml" (dom:make-dom-builder))
; cpu time (non-gc) 34,900 msec user, 40 msec system
; cpu time (gc) 760 msec user, 0 msec system
; cpu time (total) 35,660 msec user, 40 msec system
; real time 35,822 msec
; space allocation:
; 14,645,503 cons cells, 300,235,640 other bytes, 0 static bytes
* looking for david@knowledgetools.de--cxml/cxml--devel--1.0--patch-309 to compare with
* comparing to david@knowledgetools.de--cxml/cxml--devel--1.0--patch-309
M xml/xmls-compat.lisp
* modified files
--- orig/xml/xmls-compat.lisp
+++ mod/xml/xmls-compat.lisp
@@ -12,7 +12,8 @@
(defpackage cxml-xmls
(:use :cl :runes)
(:export #:make-node #:node-name #:node-ns #:node-attrs #:node-children
- #:make-xmls-builder #:map-node))
+ #:make-xmls-builder #:map-node
+ #:*identifier-case*))
(in-package :cxml-xmls)
@@ -64,6 +65,10 @@
;;;; SAX-Handler (Parser)
+(defvar *identifier-case* nil
+ "One of NIL (don't intern names), :PRESERVE, :UPCASE, :DOWNCASE, or :INVERT
+ (intern name into the keyword package after adjusting case).")
+
(defclass xmls-builder ()
((element-stack :initform nil :accessor element-stack)
(root :initform nil :accessor root)))
@@ -74,16 +79,46 @@
(defmethod sax:end-document ((handler xmls-builder))
(root handler))
+(defun string-invert-case (str)
+ (map 'string
+ (lambda (c)
+ (cond
+ ((upper-case-p c) (char-downcase c))
+ ((lower-case-p c) (char-upcase c))
+ (t c)))
+ str))
+
+(defun maybe-intern (name)
+ (if *identifier-case*
+ (let ((str (if (stringp name) name (rod-string name))))
+ (intern (ecase *identifier-case*
+ (:preserve str)
+ (:upcase (string-upcase str))
+ (:downcase (string-downcase str))
+ (:invert (string-invert-case str)))
+ :keyword))
+ name))
+
+(defun maybe-stringify (name)
+ (if (symbolp name)
+ (let ((str (symbol-name name)))
+ (ecase *identifier-case*
+ (:preserve str)
+ (:upcase (string-downcase str))
+ (:downcase (string-upcase str))
+ (:invert (string-invert-case str))))
+ name))
+
(defmethod sax:start-element
((handler xmls-builder) namespace-uri local-name qname attributes)
(declare (ignore namespace-uri))
(setf local-name (or local-name qname))
(let* ((attributes
(mapcar (lambda (attr)
- (list (sax:attribute-qname attr)
+ (list (maybe-intern (sax:attribute-qname attr))
(sax:attribute-value attr)))
attributes))
- (node (make-node :name local-name
+ (node (make-node :name (maybe-intern local-name)
:ns (let ((lq (length qname))
(ll (length local-name)))
(if (eql lq ll)
@@ -124,7 +159,7 @@
(labels ((walk (node)
(let* ((attlist
(compute-attributes node include-xmlns-attributes))
- (lname (rod (node-name node)))
+ (lname (rod (maybe-stringify (node-name node))))
(ns (rod (node-ns node)))
(qname (concatenate 'rod ns (rod ":") lname)))
;; fixme: namespaces
@@ -141,6 +176,7 @@
(remove nil
(mapcar (lambda (a)
(destructuring-bind (name value) a
+ (setf name (maybe-stringify name))
(if (or xmlnsp (not (cxml::xmlns-attr-p (rod name))))
(sax:make-attribute :qname (rod name)
:value (rod value)
<!-- $Id: catalog.dtd,v 1.10 2002/10/18 23:54:58 ndw Exp $ -->
<!ENTITY % pubIdChars "CDATA">
<!ENTITY % publicIdentifier "%pubIdChars;">
<!ENTITY % partialPublicIdentifier "%pubIdChars;">
<!ENTITY % uriReference "CDATA">
<!ENTITY % string "CDATA">
<!ENTITY % systemOrPublic "(system|public)">
<!ENTITY % p "">
<!ENTITY % s "">
<!ENTITY % nsdecl "xmlns%s;">
<!ENTITY % catalog "%p;catalog">
<!ENTITY % public "%p;public">
<!ENTITY % system "%p;system">
<!ENTITY % uri "%p;uri">
<!ENTITY % rewriteSystem "%p;rewriteSystem">
<!ENTITY % rewriteURI "%p;rewriteURI">
<!ENTITY % delegatePublic "%p;delegatePublic">
<!ENTITY % delegateSystem "%p;delegateSystem">
<!ENTITY % delegateURI "%p;delegateURI">
<!ENTITY % nextCatalog "%p;nextCatalog">
<!ENTITY % group "%p;group">
<!ENTITY % local.catalog.mix "">
<!ENTITY % local.catalog.attribs "">
<!ELEMENT %catalog; (%public;|%system;|%uri;
|%rewriteSystem;|%rewriteURI;
|%delegatePublic;|%delegateSystem;|%delegateURI;
|%nextCatalog;|%group; %local.catalog.mix;)+>
<!ATTLIST %catalog;
%nsdecl; %uriReference; #FIXED
'urn:oasis:names:tc:entity:xmlns:xml:catalog'
prefer %systemOrPublic; #IMPLIED
xml:base %uriReference; #IMPLIED
%local.catalog.attribs;
>
<!ENTITY % local.public.attribs "">
<!ELEMENT %public; EMPTY>
<!ATTLIST %public;
id ID #IMPLIED
publicId %publicIdentifier; #REQUIRED
uri %uriReference; #REQUIRED
xml:base %uriReference; #IMPLIED
%local.public.attribs;
>
<!ENTITY % local.system.attribs "">
<!ELEMENT %system; EMPTY>
<!ATTLIST %system;
id ID #IMPLIED
systemId %string; #REQUIRED
uri %uriReference; #REQUIRED
xml:base %uriReference; #IMPLIED
%local.system.attribs;
>
<!ENTITY % local.uri.attribs "">
<!ELEMENT %uri; EMPTY>
<!ATTLIST %uri;
id ID #IMPLIED
name %string; #REQUIRED
uri %uriReference; #REQUIRED
xml:base %uriReference; #IMPLIED
%local.uri.attribs;
>
<!ENTITY % local.rewriteSystem.attribs "">
<!ELEMENT %rewriteSystem; EMPTY>
<!ATTLIST %rewriteSystem;
id ID #IMPLIED
systemIdStartString %string; #REQUIRED
rewritePrefix %string; #REQUIRED
%local.rewriteSystem.attribs;
>
<!ENTITY % local.rewriteURI.attribs "">