You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@xalan.apache.org by Christoph Reck <Ch...@dlr.de> on 2000/11/30 11:58:10 UTC

Xalan-J 2 bug: Node.isSupported, XPath:position(), serializer.OutputFormat

Hi,

going from Xalan 1.1_D01 to Xalan 2.0_D01 I found the following 
problems:

1. The org.w3c.Node included in Xalan defines a method supports(),
   whereas the W3C standard is defining isSupported() for DOM2.
   This causes problems e.g. in xpath.axes.ChildWalkerOneStep.nextNode()
   emitting a AbstractMethodException when the xerces_1.2.X.jar is
   before the xalan.jar.

2. The position() function in XPath is returning relative positions.
   When doing an apply-templates on a selected subset, the first
   element in the template match is not 1 as it was in the earlyer
   Xalan implementation. I have found no workaround for this:
     <xsl:if test="position &gt; 1"><br/></xsl:if>
   to separate continuation lines for each other.

   It seems that Xalan2 does not make a copy, but select... returns a 
   NodeList referencing the original nodes and their position is
   then relative to the source and not to the select.

3. org.apache.xml.serializer.OutputFormat does not respect the
   setOmitXMLDeclaration(true) flag. Previous xerces version 
   did not emit the doctype declaration, the new xerces.jar does 
   emit it (this is really a xerces bug).

I would be glad if these problems could be adressed. (I'm not on the
developers mailing list so CC any responses to me direclyt).

:) Christoph

Re: Xalan-J 2 bug: Node.isSupported, XPath:position(), serializer.OutputFormat

Posted by Gary L Peskin <ga...@firstech.com>.
Christoph Reck wrote:
> 
> Here the sample XML and XSL code for the bugs mentioned below:

Chris --

I just tried this with the current version of XalanJ2 built from CVS and
I get exactly the same output that you get from XalanJ1.  There was a
bug with position() which was fixed a while back but after XalanJ
2.0.D01 and I think that that's what was causing your problem.

Scott has said that a new alpha version of XalanJ2 should be out soon. 
In the meantime, you'll need to do a build from the CVS source.

Gary

Re: Xalan-J 2 bug: Node.isSupported, XPath:position(), serializer.OutputFormat

Posted by Christoph Reck <Ch...@dlr.de>.
Here the sample XML and XSL code for the bugs mentioned below:

----------- output of SimpleTransform of xalan_1_1_D01 --------------

First the list with apply template:
1 TEST Test entry 
NEWLINE 2 DLR Deutsches Zentrum fuer Luft- und Raumfahrt 
NEWLINE 3 ESA European Space Agency 
NEWLINE 4 Eurimage

Next the same list but with for-each:1 TEST Test entry
NEWLINE 2 DLR Deutsches Zentrum fuer Luft- und Raumfahrt
NEWLINE 3 ESA European Space Agency
NEWLINE 4 Eurimage

And again the list with apply template:1 TEST Test entry 
NEWLINE 2 DLR Deutsches Zentrum fuer Luft- und Raumfahrt 
NEWLINE 3 ESA European Space Agency 
NEWLINE 4 Eurimagecat: cannot open foo.out
------------- end of SimpleTransform of xalan_1_1_D01 ---------------

----------- output of SimpleTransform of xalan-j_2_0_D01 --------------

First the list with apply template:
1 TEST Test entry 
NEWLINE 2 DLR Deutsches Zentrum fuer Luft- und Raumfahrt 
NEWLINE 3 ESA European Space Agency 
NEWLINE 4 Eurimage

Next the same list but with for-each:
NEWLINE 5 TEST Test entry
NEWLINE 6 DLR Deutsches Zentrum fuer Luft- und Raumfahrt
NEWLINE 7 ESA European Space Agency
NEWLINE 8 Eurimage

And again the list with apply template: 
NEWLINE 5 TEST Test entry 
NEWLINE 6 DLR Deutsches Zentrum fuer Luft- und Raumfahrt 
NEWLINE 7 ESA European Space Agency 
NEWLINE 8 Eurimage
------------- end of SimpleTransform of xalan-j_2_0_D01 ---------------
Note the extra NEWLINE at the begining of the latter two blocks
and the erroneous numbering.

------------------------ foo.xml ----------------------------
<GIP>
  <ServiceFacility>G</ServiceFacility>
  <ServiceFunction>U</ServiceFunction>
  <SessionId>*</SessionId>
  <ProgressiveNumber>*</ProgressiveNumber>
  <GipResultCode>_</GipResultCode>
  <TargetService Provider="ESA" Facility="EECF" CollectionId="?" />
  <UpdateStamp ResponsibleForUpdate="TEST" IdentifierForUpdate="000"
     ReasonForUpdate="MUIS-C Test" />
  <SubFunction>A</SubFunction>

  <AttributeValueDescriptor>
    <LastUpdate>2000-01-24 18:00:00.00</LastUpdate>
    <AttributeId>DPRO</AttributeId>
    <AttributeValue>TEST</AttributeValue>
    <Provider>TEST</Provider>
    <ShortCode>TEST</ShortCode>
    <ShortName>TEST</ShortName>
    <LongName>Test entry</LongName>
    <Abstract>?</Abstract>
    <DocumentReference />
  </AttributeValueDescriptor>

  <AttributeValueDescriptor>
    <LastUpdate>2000-01-24 18:00:00.00</LastUpdate>
    <AttributeId>DPRO</AttributeId>
    <AttributeValue>DLR</AttributeValue>
    <Provider>DLR</Provider>
    <ShortCode>DLR</ShortCode>
    <ShortName>DLR</ShortName>
    <LongName>Deutsches Zentrum fuer Luft- und Raumfahrt</LongName>
    <Abstract>?</Abstract>
    <DocumentReference DocumentPointer="http://isis.dlr.de"
       DocumentDescription="DLR Description" />
  </AttributeValueDescriptor>

  <AttributeValueDescriptor>
    <LastUpdate>2000-01-24 18:00:00.00</LastUpdate>
    <AttributeId>DPRO</AttributeId>
    <AttributeValue>ESA</AttributeValue>
    <Provider>ESA</Provider>
    <ShortCode>ESA</ShortCode>
    <ShortName>ESA</ShortName>
    <LongName>European Space Agency</LongName>
    <Abstract>?</Abstract>
    <DocumentReference DocumentPointer="http://www.esa.int"
       DocumentDescription="ESA Description" />
  </AttributeValueDescriptor>

  <AttributeValueDescriptor>
    <LastUpdate>2000-01-24 18:00:00.00</LastUpdate>
    <AttributeId>DPRO</AttributeId>
    <AttributeValue>Eurimage</AttributeValue>
    <Provider>Eurimage</Provider>
    <ShortCode>Eurimage</ShortCode>
    <ShortName>Eurimage</ShortName>
    <LongName>Eurimage</LongName>
    <Abstract>?</Abstract>
    <DocumentReference />
  </AttributeValueDescriptor>

   <AttributeValueDescriptor>
      <LastUpdate>2000-11-07T09:58</LastUpdate>
      <AttributeId>*AID</AttributeId>
      <AttributeValue>DPRO</AttributeValue>
      <ShortName>Provider</ShortName>
   </AttributeValueDescriptor>

   <AttributeValueDescriptor>
      <LastUpdate>2000-11-07T09:58</LastUpdate>
      <AttributeId>*AID</AttributeId>
      <AttributeValue>DFAC</AttributeValue>
      <ShortName>Facility</ShortName>
   </AttributeValueDescriptor>

</GIP>
-------------------- end of foo.xml -------------------------

------------------------ foo.xsl ----------------------------
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" />

<!-- example extract to format valids -->
<xsl:template match="*" >
 <xsl:variable name="list" select="AttributeValueDescriptor[AttributeId='DPRO']" />
<xsl:text>
First the list with apply template:
</xsl:text>
 <xsl:apply-templates select="$list" mode="called" />

 <xsl:text>

Next the same list but with for-each:</xsl:text>

 <xsl:for-each select="$list">
   <!-- ### the first entry should not emit a new line -->
   <xsl:if test="position() != 1"><xsl:text>
NEWLINE </xsl:text>
   </xsl:if>
   <!-- ### this is emitting wrong number in XalanJ2 (it seems to be the output position) -->
   <xsl:value-of select="position()" /> 
   <xsl:text> </xsl:text><xsl:value-of select="ShortName" />
   <xsl:if test="ShortName != LongName">
     <xsl:text> </xsl:text><xsl:value-of select="LongName" />
   </xsl:if>
 </xsl:for-each>

 <xsl:text>

And again the list with apply template:</xsl:text>
 <xsl:apply-templates select="$list" mode="called" />

</xsl:template>

<xsl:template match="AttributeValueDescriptor" mode="called" >
   <!-- ### the first entry should not emit a new line -->
   <xsl:if test="position() != 1"><xsl:text> 
NEWLINE </xsl:text>
   </xsl:if>
   <!-- ### this is emitting wrong number in XalanJ2 -->
   <xsl:value-of select="position()" /> 
   <xsl:text> </xsl:text><xsl:value-of select="ShortName" />
   <xsl:if test="ShortName != LongName">
     <xsl:text> </xsl:text><xsl:value-of select="LongName" />
   </xsl:if>
</xsl:template>

</xsl:stylesheet>
-------------------- end of foo.xsl -------------------------

Gary L Peskin wrote:
> 
> Christoph Reck wrote:
> >
> > Hi,
> >
> > going from Xalan 1.1_D01 to Xalan 2.0_D01 I found the following
> > problems:
> >
> > 1. The org.w3c.Node included in Xalan defines a method supports(),
> >    whereas the W3C standard is defining isSupported() for DOM2.
> >    This causes problems e.g. in xpath.axes.ChildWalkerOneStep.nextNode()
> >    emitting a AbstractMethodException when the xerces_1.2.X.jar is
> >    before the xalan.jar.
> 
> You need to use the version of xerces.jar that comes with Xalan.  Xalan
> 1.1_D01 is an older Xalan version and requires the old Xerces. Xalan 2.0
> requires the new Xerces.  This has been fixed in the latest builds of
> both versions of Xalan so that you should be able to use the latest
> version of Xerces with the latest versions of both XalanJ 1 and XalanJ
> 2.

I am using the xerces.jar within xalan-j_2_0_D01. Pasing the CVSWEB
of xalan-j_2_0_D02, this seems to be fixed (The 2_0_D02 version does 
not seem to be yet downloadable?).

> 
> > 2. The position() function in XPath is returning relative positions.
> >    When doing an apply-templates on a selected subset, the first
> >    element in the template match is not 1 as it was in the earlyer
> >    Xalan implementation. I have found no workaround for this:
> >      <xsl:if test="position &gt; 1"><br/></xsl:if>
> >    to separate continuation lines for each other.
> >
> >    It seems that Xalan2 does not make a copy, but select... returns a
> >    NodeList referencing the original nodes and their position is
> >    then relative to the source and not to the select.
> 
> Can you please provide a sample XML and XSL and I'll see if it causes a
> problem with the latest version of Xalan 2?

see examples above.

> 
> > 3. org.apache.xml.serializer.OutputFormat does not respect the
> >    setOmitXMLDeclaration(true) flag. Previous xerces version
> >    did not emit the doctype declaration, the new xerces.jar does
> >    emit it (this is really a xerces bug).
> 
> This may also be fixed in the latest version of Xerces.  Can you provide
> sample XML and XSL?

Note that if the XSL contains <xsl:output method="text" />,
it does not emit anything, but without it xalan-j_2_0_D01 emits
the <?xml ...> directive.

-------------------- code to format the output -------------------
    /**
     * Format XML indented nicely.
     *
     * @param xml The XML node to pretty print.
     * @return A string with the XML prettely formatted.
     */
    public String format(Node xml, int indent, String indentOffset)
    {
        OutputFormat fmt = new OutputFormat();
        fmt.setIndent(indent);
        fmt.setLineSeparator("\n" + indentOffset);
        fmt.setOmitXMLDeclaration(true);
        ByteArrayOutputStream buf = new ByteArrayOutputStream();
        HTMLSerializer serializer = new HTMLSerializer(buf, fmt);
        try {
            if (xml instanceof Element)
              serializer.serialize( (Element) xml );
            else if (xml instanceof Document)
              serializer.serialize( ((Document) xml).getDocumentElement() );
            else
              serializer.serialize( xml.getOwnerDocument() );
        } catch (Exception ex) {
            // ignore
        }

        return buf.toString();
    }
------------------ end of code to format the output -----------------

> 
> Gary


:) Christoph

Re: Xalan-J 2 bug: Node.isSupported, XPath:position(), serializer.OutputFormat

Posted by Gary L Peskin <ga...@firstech.com>.
Christoph Reck wrote:
> 
> Hi,
> 
> going from Xalan 1.1_D01 to Xalan 2.0_D01 I found the following
> problems:
> 
> 1. The org.w3c.Node included in Xalan defines a method supports(),
>    whereas the W3C standard is defining isSupported() for DOM2.
>    This causes problems e.g. in xpath.axes.ChildWalkerOneStep.nextNode()
>    emitting a AbstractMethodException when the xerces_1.2.X.jar is
>    before the xalan.jar.

You need to use the version of xerces.jar that comes with Xalan.  Xalan
1.1_D01 is an older Xalan version and requires the old Xerces. Xalan 2.0
requires the new Xerces.  This has been fixed in the latest builds of
both versions of Xalan so that you should be able to use the latest
version of Xerces with the latest versions of both XalanJ 1 and XalanJ
2.

> 2. The position() function in XPath is returning relative positions.
>    When doing an apply-templates on a selected subset, the first
>    element in the template match is not 1 as it was in the earlyer
>    Xalan implementation. I have found no workaround for this:
>      <xsl:if test="position &gt; 1"><br/></xsl:if>
>    to separate continuation lines for each other.
> 
>    It seems that Xalan2 does not make a copy, but select... returns a
>    NodeList referencing the original nodes and their position is
>    then relative to the source and not to the select.

Can you please provide a sample XML and XSL and I'll see if it causes a
problem with the latest version of Xalan 2?

> 3. org.apache.xml.serializer.OutputFormat does not respect the
>    setOmitXMLDeclaration(true) flag. Previous xerces version
>    did not emit the doctype declaration, the new xerces.jar does
>    emit it (this is really a xerces bug).

This may also be fixed in the latest version of Xerces.  Can you provide
sample XML and XSL?

Gary