DesignLiquido / xslt-processor

A JavaScript XSLT processor without native library dependencies
GNU Lesser General Public License v3.0
102 stars 32 forks source link

Incorrect output for Mozilla example #110

Open erickoledadevrel opened 1 day ago

erickoledadevrel commented 1 day ago

When testing this library I used a sample XML + XSLT from the Mozilla website. The library doesn't seem to work correctly with this example, although I haven't been able to determine why exactly.

Repro

  1. Install the library.
  2. Run the following code (Node.js).
const xslt = require('xslt-processor');

const xmlString = `
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="example.xsl"?>
<Article>
  <Title>My Article</Title>
  <Authors>
    <Author>Mr. Foo</Author>
    <Author>Mr. Bar</Author>
  </Authors>
  <Body>This is my article text.</Body>
</Article>
`;

const xsltString = `
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="text"/>

  <xsl:template match="/">
    Article - <xsl:value-of select="/Article/Title"/>
    Authors: <xsl:apply-templates select="/Article/Authors/Author"/>
  </xsl:template>

  <xsl:template match="Author">
    - <xsl:value-of select="." />
  </xsl:template>

</xsl:stylesheet>
`;

const processor = new xslt.Xslt();
const parser = new xslt.XmlParser();
const result = processor.xsltProcess(
  parser.xmlParse(xmlString),
  parser.xmlParse(xsltString)
).then(result => console.log(result));

Expected


    Article - My Article
    Authors: 
    - Mr. Foo
    - Mr. Bar

Actual


    - My ArticleMr. FooMr. Bar
leonelsanchesdasilva commented 1 day ago

Hi @erickoledadevrel :wave:

Thanks for reporting this. I added the corresponding unit test in the codebase.

It's basically what was reported in https://github.com/DesignLiquido/xslt-processor/issues/108 and https://github.com/DesignLiquido/xslt-processor/issues/109: the logic handling text nodes is not great, and the problem happens because text nodes are overridden when they should not.

As I mentioned in the other issues, there are two problems to be solved here:

I started thinking about the logic on this some time ago, but I didn't have the time to dedicate myself to this. I hope to get some time in the next weeks to plan a good algorithm and implement it. Your example should help me tremendously on it.