Uploaded image for project: 'XalanJ2'
  1. XalanJ2
  2. XALANJ-2302

Prefix collision bug during serialization

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Major
    • Resolution: Unresolved
    • None
    • None
    • None
    • None
    • PatchAvailable

    Description

      During work on xalanj-2219, which Henry Zongaro reviewed, he found a related bug where
      an attribute added through manipulation of a DOM would cause a prefix collision.

      His testcase was similar to the one in xalanj-2219. First create an element named "p:child" in namespace URI "child".
      When serialized this element would look like this:
      <p:child xmlns='child' />

      Then to this DOM Element, add an attribute named q:attr with value 'val' and have attribute in the namespace 'moo'.
      When serialized this element would look like this:
      <p:child xlmns='child' q:attr='val' xmlns:q='moo' />

      Now to cause the collision have the name of the attribute be 'p:attr'. The prefix p must map to both 'child' and to 'moo'.
      The only way out is to NOT use p for one of the prefixes, and to pick a new one that is not mapped, something like this:
      <p:child xmlns='child' ns0:attr='val' xmlns:ns0='moo' />

      Henry's testcase, much like the one in xalanj-2219 is this:
      -------------------------------------------------------------------------------
      import java.io.StringReader;
      import javax.xml.parsers.DocumentBuilderFactory;
      import javax.xml.transform.Result;
      import javax.xml.transform.Source;
      import javax.xml.transform.Transformer;
      import javax.xml.transform.TransformerFactory;
      import javax.xml.transform.dom.DOMSource;
      import javax.xml.transform.stream.StreamResult;
      import javax.xml.transform.stream.StreamSource;
      import org.w3c.dom.Document;
      import org.w3c.dom.Element;
      import org.xml.sax.InputSource;
      public class j2219b {
      private static final String IDENTITY_XSLT_WITH_INDENT =
      "<xsl:stylesheet version='1.0' " +
      "xmlns:xsl='http://www.w3.org/1999/XSL/Transform' " +
      "xmlns:xalan='http://xml.apache.org/xslt' " +
      "exclude-result-prefixes='xalan'>" +
      "<xsl:output method='xml' indent='yes' xalan:indent-amount='4'/>" +
      "<xsl:template match='@*|node()'>" +
      "<xsl:copy>" +
      "<xsl:apply-templates select='@*|node()'/>" +
      "</xsl:copy>" +
      "</xsl:template>" +
      "</xsl:stylesheet>";
      public static void main(String[] args) throws Exception

      { String data = "<p:root xmlns:p='root'/>"; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); Document doc = dbf.newDocumentBuilder().parse(new InputSource(new StringReader(data))); Element e = doc.createElementNS("child", "p:child"); e.setAttributeNS("moo", "p:attr", "val"); doc.getDocumentElement().appendChild(e); Transformer t = TransformerFactory.newInstance().newTransformer( new StreamSource(new StringReader(IDENTITY_XSLT_WITH_INDENT))); Source source = new DOMSource(doc); Result result = new StreamResult(System.out); t.transform(source, result); }

      }

      -------------------------------------------------------------------------------

      Now there is a problem. When serialized the same prefix cannot be used

      Attachments

        1. serializer.patch1.txt
          2 kB
          Brian Minchau

        Issue Links

          Activity

            People

              Unassigned Unassigned
              minchau@ca.ibm.com Brian Minchau
              Yash Talwar Yash Talwar
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

                Created:
                Updated: