[This is a re-post of a pending patch.] Joerg Henne wrote: > > Hi, > > the way I read the SAX specification, the qName (or raw name) of elements that > is passed to the callback methods is of purely informal character and does not > necessarily contain the full (raw) element name. However, C2's serialization > to XML results in the qName being used to name the output elements. This is > due to the missing or incomplete namespace support in the SerializerToXML from > Xalan which is used. > > AbstractTextSerializer already contains code to work around Xalan problems, so > it could fix this problem as well, although fixing it comes at the cost of 2 > hashtable lookups and string concatenations per element. If you agree that > this should be done, the following patch will do the job. > > Joerg Henne
Index: AbstractTextSerializer.java =================================================================== RCS file: /home/cvspublic/xml-cocoon2/src/org/apache/cocoon/serialization/AbstractTextSerializer.java,v retrieving revision 1.3 diff -u -r1.3 AbstractTextSerializer.java --- AbstractTextSerializer.java 2001/08/20 13:55:16 1.3 +++ AbstractTextSerializer.java 2001/08/21 09:43:19 @@ -26,6 +26,8 @@ import javax.xml.transform.sax.SAXTransformerFactory; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.HashMap; import java.util.Properties; /** @@ -58,6 +60,13 @@ private List uriList = new ArrayList(); /** + * Maps of URI<->prefix mappings. Used to work around a bug in the Xalan + * serializer. + */ + private Map uriToPrefixMap = new HashMap(); + private Map prefixToUriMap = new HashMap(); + + /** * True if there has been some startPrefixMapping() for the coming element. */ private boolean hasMappings = false; @@ -152,6 +161,8 @@ */ public void recycle() { clearMappings(); + this.uriToPrefixMap.clear(); + this.prefixToUriMap.clear(); super.recycle(); } @@ -176,10 +187,32 @@ this.prefixList.add(prefix); this.uriList.add(uri); + // store mappings for xalan-bug-workaround. + // append the prefix colon now, in order to save concatenations later. + this.uriToPrefixMap.put(uri, prefix + ":"); + this.prefixToUriMap.put(prefix, uri); + super.startPrefixMapping(prefix, uri); } /** + * End the scope of a prefix-URI mapping: + * remove entry from mapping tables. + */ + public void endPrefixMapping(String prefix) + throws SAXException { + // remove mappings for xalan-bug-workaround. + // Unfortunately, we're not passed the uri, but the prefix here, + // so we need to maintain maps in both directions. + if(this.prefixToUriMap.containsKey(prefix)) { + this.uriToPrefixMap.remove((String) this.prefixToUriMap.get(prefix)); + this.prefixToUriMap.remove(prefix); + } + + super.endPrefixMapping(prefix); + } + + /** * Ensure all namespace declarations are present as <code>xmlns:</code> attributes * and add those needed before calling superclass. This is a workaround for a Xalan bug * (at least in version 2.0.1) : <code>org.apache.xalan.serialize.SerializerToXML</code> @@ -187,7 +220,11 @@ */ public void startElement(String eltUri, String eltLocalName, String eltQName, Attributes attrs) throws SAXException { - + + // try to restore the qName. The map already contains the colon + if(eltUri.length() != 0 && this.uriToPrefixMap.containsKey(eltUri) ) + eltQName = (String) this.uriToPrefixMap.get(eltUri) + eltLocalName; + if (this.hasMappings) { // Add xmlns* attributes where needed @@ -247,6 +284,19 @@ // Normal job super.startElement(eltUri, eltLocalName, eltQName, attrs); } + } + + /** + * Receive notification of the end of an element. + * Try to restore the element qName. + */ + public void endElement(String eltUri, String eltLocalName, String eltQName) + throws SAXException { + // try to restore the qName. The map already contains the colon + if(eltUri.length() != 0 && this.uriToPrefixMap.containsKey(eltUri) ) + eltQName = (String) this.uriToPrefixMap.get(eltUri) + eltLocalName; + + super.endElement(eltUri, eltLocalName, eltQName); } private void clearMappings()
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, email: [EMAIL PROTECTED]