PHP : different behaviour of XSLT Processor in Windows WRT to Linux












4















I've got this php snippet:



$xsltPath = $argv[1];
$xmlPath = $argv[2];

$xslt = file_get_contents($xsltPath);
$xml = file_get_contents($xmlPath);

$templateCMSObj = new DOMDocument();
$templateCMSObj->loadXML($xslt);
$ekbXMLObj = new DOMDocument();
$ekbXMLObj->loadXML($xml);
$proc = new XSLTProcessor();
$proc->importStylesheet($templateCMSObj);
$html = $proc->transformToXML($ekbXMLObj);
echo($html);
exit;


Which simply applies an XSLT to a given XML document.



When I apply the below XSLT to the same XML doc I got a different behaviour of Windows wrt to Linux PHP version.



Here's php and libxml version detail:



Windows:



PHP 7.1.6 (cli) (built: Jun  8 2017 02:06:32) ( ZTS MSVC14 (Visual C++ 2015) x86 )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies

XML Support => active
XML Namespace Support => active
libxml2 Version => 2.9.4
XMLReader => enabled
XMLWriter => enabled
XSL => enabled
libxslt Version => 1.1.29
libxslt compiled against libxml Version => 2.9.4
EXSLT => enabled
libexslt Version => 0.8.17


Linux:



PHP 7.0.32-1~dotdeb+8.1 (cli) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.0.32-1~dotdeb+8.1, Copyright (c) 1999-2017, by Zend Technologies
with Xdebug v2.5.5, Copyright (c) 2002-2017, by Derick Rethans

XML Support => active
XML Namespace Support => active
libxml2 Version => 2.9.1
XMLReader => enabled
XMLWriter => enabled
XSL => enabled
libxslt Version => 1.1.28
libxslt compiled against libxml Version => 2.9.1
EXSLT => enabled
libexslt Version => 1.1.28


Here's is the XSLT code:



<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://new.webservice.namespace">
<xsl:output method="xml" version="1.0" indent="yes"/>
<xsl:param name="searchPath" select="11"/>
<xsl:variable name="slash" select="'/'"/>
<xsl:variable name="dot" select="'.'"/>
<xsl:variable name="open_bracket" select="'{'"/>
<xsl:variable name="closed_bracket" select="'}'"/>
<xsl:template match="/">
<ns:flat_pallet>
<xsl:attribute name="tipo"><xsl:value-of select="//ns:EKB_piatto/@tipo"/></xsl:attribute>
<xsl:apply-templates select=".//ns:gruppo_logico/ns:versione/ns:contenuto/ns:riferimento_oi"/>
</ns:flat_pallet>
</xsl:template>

<!--restituisco tipo del box e l'indice relativo a nel sottoalbero-->
<xsl:template match="ns:gruppo_logico">
<xsl:variable name="tipo">
<xsl:value-of select="@tipo"/>
</xsl:variable>
<xsl:variable name="index">
<xsl:number level="single" count="node()[@tipo=$tipo]" format="1"/>
</xsl:variable>
<xsl:value-of select="normalize-space($tipo)" disable-output-escaping="yes"/>
<xsl:value-of select="$open_bracket"/>
<xsl:value-of select="$index -1" disable-output-escaping="yes"/>
<xsl:value-of select="$closed_bracket"/>
<xsl:value-of select="$slash"/>
</xsl:template>
<!--quando sono in una unit risalgo i box progenitori-->
<xsl:template match="ns:riferimento_oi">
<xsl:variable name="tipoUnit" select="./ns:tipo"/>
<xsl:variable name="index">
<xsl:number level="single" count="node()[node()/ns:tipo=$tipoUnit]" format="1"/>
</xsl:variable>
<xsl:variable name="labelPath">
<xsl:apply-templates select="ancestor::ns:gruppo_logico"/>
<xsl:value-of select="$tipoUnit"/>
<xsl:value-of select="$open_bracket"/>
<xsl:value-of select="$index -1"/>
<xsl:value-of select="$closed_bracket"/>
</xsl:variable>
<xsl:copy>
<xsl:attribute name="labelPath"><xsl:value-of select="$labelPath" disable-output-escaping="yes"/></xsl:attribute>
<xsl:attribute name="unitIndex"><xsl:value-of select="$index" disable-output-escaping="yes"/></xsl:attribute>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<!-- just copy all my attributes and child nodes, except if there's a better template for some of them -->
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<!--template per rimuovere nodi vuoti-->
<xsl:template match="*[not(@*|*|comment()|processing-instruction()) and normalize-space()='']"/>
</xsl:stylesheet>


And the XML Doc which gaves different results in win and linux
XSLT:



<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns:dettaglioFormEKBSOUT xmlns:ns="http://new.webservice.namespace">
<ns:EKB_piatto>
<ns:campo_GL>
<ns:gruppo_logico tipo="Standard">
<ns:versione id="1">
<ns:contenuto>
<ns:riferimento_oi>
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.1</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
</ns:contenuto>
<ns:contenuto>
<ns:riferimento_oi>
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.2</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
</ns:contenuto>
</ns:versione>
</ns:gruppo_logico>
<ns:gruppo_logico tipo="Standard_due">
<ns:versione id="1">
<ns:contenuto>
<ns:riferimento_oi>
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.1</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
</ns:contenuto>
<ns:contenuto>
<ns:riferimento_oi>
<ns:tipo>Standard_due</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.2</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
</ns:contenuto>
</ns:versione>
</ns:gruppo_logico>
</ns:campo_GL>
</ns:EKB_piatto>
</ns:dettaglioFormEKBSOUT>


Linux output
This is the desired output which actually results from applying XSLT on Linux:



<?xml version="1.0"?>
<ns:flat_pallet xmlns:ns="http://new.webservice.namespace" tipo="">
<ns:riferimento_oi labelPath="Standard{0}/Standard{0}" unitIndex="1">
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.1</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
<ns:riferimento_oi labelPath="Standard{0}/Standard{1}" unitIndex="2">
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.2</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
<ns:riferimento_oi labelPath="Standard_due{0}/Standard{0}" unitIndex="1">
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.1</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
<ns:riferimento_oi labelPath="Standard_due{0}/Standard_due{0}" unitIndex="1">
<ns:tipo>Standard_due</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.2</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
</ns:flat_pallet>


Windows output
This is the wrong result produces on Windows:



<?xml version="1.0"?>
<ns:flat_pallet xmlns:ns="http://new.webservice.namespace" tipo="">
<ns:riferimento_oi labelPath="Standard{0}/Standard{0}" unitIndex="1">
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.1</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
<ns:riferimento_oi labelPath="Standard{0}/Standard{1}" unitIndex="2">
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.2</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
<ns:riferimento_oi labelPath="Standard_due{NaN}/Standard{0}" unitIndex="1">
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.1</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
<ns:riferimento_oi labelPath="Standard_due{NaN}/Standard_due{NaN}" unitIndex="">
<ns:tipo>Standard_due</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.2</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
</ns:flat_pallet>


The problem lies in the NaN put instead of relative index: it surely has to do with xsl:number element, but I can't figure out how to fix this...





Edit after accepted answer



By changing xsl:number count attribute to * instead of node() the xslt template works as expected on both Win and Linux.



Here's the updated code:



<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://new.webservice.namespace">
<xsl:output method="xml" version="1.0" indent="yes"/>
<xsl:param name="searchPath" select="11"/>
<xsl:variable name="slash" select="'/'"/>
<xsl:variable name="dot" select="'.'"/>
<xsl:variable name="open_bracket" select="'{'"/>
<xsl:variable name="closed_bracket" select="'}'"/>
<xsl:template match="/">
<ns:flat_pallet>
<xsl:attribute name="tipo"><xsl:value-of select="//ns:EKB_piatto/@tipo"/></xsl:attribute>
<xsl:apply-templates select=".//ns:gruppo_logico/ns:versione/ns:contenuto/ns:riferimento_oi"/>
</ns:flat_pallet>
</xsl:template>

<!--restituisco tipo del box e l'indice relativo a nel sottoalbero-->
<xsl:template match="ns:gruppo_logico">
<xsl:variable name="tipo">
<xsl:value-of select="@tipo"/>
</xsl:variable>
<xsl:variable name="index">
<xsl:number level="single" count="*[@tipo=$tipo]" format="1"/>
</xsl:variable>
<xsl:value-of select="normalize-space($tipo)" disable-output-escaping="yes"/>
<xsl:value-of select="$open_bracket"/>
<xsl:value-of select="$index -1" disable-output-escaping="yes"/>
<xsl:value-of select="$closed_bracket"/>
<xsl:value-of select="$slash"/>
</xsl:template>
<!--quando sono in una unit risalgo i box progenitori-->
<xsl:template match="ns:riferimento_oi">
<xsl:variable name="tipoUnit" select="./ns:tipo"/>
<xsl:variable name="index">
<xsl:number level="single" count="*[*/ns:tipo=$tipoUnit]" format="1"/>
</xsl:variable>
<xsl:variable name="labelPath">
<xsl:apply-templates select="ancestor::ns:gruppo_logico"/>
<xsl:value-of select="$tipoUnit"/>
<xsl:value-of select="$open_bracket"/>
<xsl:value-of select="$index -1"/>
<xsl:value-of select="$closed_bracket"/>
</xsl:variable>
<xsl:copy>
<xsl:attribute name="labelPath"><xsl:value-of select="$labelPath" disable-output-escaping="yes"/></xsl:attribute>
<xsl:attribute name="unitIndex"><xsl:value-of select="$index" disable-output-escaping="yes"/></xsl:attribute>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<!-- just copy all my attributes and child nodes, except if there's a better template for some of them -->
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<!--template per rimuovere nodi vuoti-->
<xsl:template match="*[not(@*|*|comment()|processing-instruction()) and normalize-space()='']"/>
</xsl:stylesheet>









share|improve this question

























  • I see no difference between the Linux and Windows outputs.

    – MonkeyZeus
    Nov 20 '18 at 17:39






  • 1





    This is very interesting! Issue can even be reproduced in xslt fiddle, toggling the engine between Saxon and others to "client-side processor".

    – Parfait
    Nov 20 '18 at 17:53






  • 1





    This would be much easier (and more useful to others) if the example were minimized to only what's necessary to show the problem - see: Minimal, Complete, and Verifiable example.

    – michael.hor257k
    Nov 21 '18 at 8:32






  • 1





    At xsltfiddle.liberty-development.net/6qVRKxe/2 I have tried to make a reduced test case, with Chrome (at least my current version 70.0.3538.102 on Windows 10 64-bit) it shows the problem. @nwellnhof, is that a bug in the Windows version of libxslt? I am having a hard time to find an up to date binary of xsltproc/libxslt for Windows to test myself.

    – Martin Honnen
    Nov 21 '18 at 10:18






  • 2





    For what it's worth, I tried the latest PHP release 7.2.12 on Windows which has the latest libxslt 1.1.32 and it exhibits the problem, so I have opened an issue on libxslt at gitlab.gnome.org/GNOME/libxslt/issues/6 to see whether they consider it a bug.

    – Martin Honnen
    Nov 21 '18 at 14:24
















4















I've got this php snippet:



$xsltPath = $argv[1];
$xmlPath = $argv[2];

$xslt = file_get_contents($xsltPath);
$xml = file_get_contents($xmlPath);

$templateCMSObj = new DOMDocument();
$templateCMSObj->loadXML($xslt);
$ekbXMLObj = new DOMDocument();
$ekbXMLObj->loadXML($xml);
$proc = new XSLTProcessor();
$proc->importStylesheet($templateCMSObj);
$html = $proc->transformToXML($ekbXMLObj);
echo($html);
exit;


Which simply applies an XSLT to a given XML document.



When I apply the below XSLT to the same XML doc I got a different behaviour of Windows wrt to Linux PHP version.



Here's php and libxml version detail:



Windows:



PHP 7.1.6 (cli) (built: Jun  8 2017 02:06:32) ( ZTS MSVC14 (Visual C++ 2015) x86 )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies

XML Support => active
XML Namespace Support => active
libxml2 Version => 2.9.4
XMLReader => enabled
XMLWriter => enabled
XSL => enabled
libxslt Version => 1.1.29
libxslt compiled against libxml Version => 2.9.4
EXSLT => enabled
libexslt Version => 0.8.17


Linux:



PHP 7.0.32-1~dotdeb+8.1 (cli) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.0.32-1~dotdeb+8.1, Copyright (c) 1999-2017, by Zend Technologies
with Xdebug v2.5.5, Copyright (c) 2002-2017, by Derick Rethans

XML Support => active
XML Namespace Support => active
libxml2 Version => 2.9.1
XMLReader => enabled
XMLWriter => enabled
XSL => enabled
libxslt Version => 1.1.28
libxslt compiled against libxml Version => 2.9.1
EXSLT => enabled
libexslt Version => 1.1.28


Here's is the XSLT code:



<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://new.webservice.namespace">
<xsl:output method="xml" version="1.0" indent="yes"/>
<xsl:param name="searchPath" select="11"/>
<xsl:variable name="slash" select="'/'"/>
<xsl:variable name="dot" select="'.'"/>
<xsl:variable name="open_bracket" select="'{'"/>
<xsl:variable name="closed_bracket" select="'}'"/>
<xsl:template match="/">
<ns:flat_pallet>
<xsl:attribute name="tipo"><xsl:value-of select="//ns:EKB_piatto/@tipo"/></xsl:attribute>
<xsl:apply-templates select=".//ns:gruppo_logico/ns:versione/ns:contenuto/ns:riferimento_oi"/>
</ns:flat_pallet>
</xsl:template>

<!--restituisco tipo del box e l'indice relativo a nel sottoalbero-->
<xsl:template match="ns:gruppo_logico">
<xsl:variable name="tipo">
<xsl:value-of select="@tipo"/>
</xsl:variable>
<xsl:variable name="index">
<xsl:number level="single" count="node()[@tipo=$tipo]" format="1"/>
</xsl:variable>
<xsl:value-of select="normalize-space($tipo)" disable-output-escaping="yes"/>
<xsl:value-of select="$open_bracket"/>
<xsl:value-of select="$index -1" disable-output-escaping="yes"/>
<xsl:value-of select="$closed_bracket"/>
<xsl:value-of select="$slash"/>
</xsl:template>
<!--quando sono in una unit risalgo i box progenitori-->
<xsl:template match="ns:riferimento_oi">
<xsl:variable name="tipoUnit" select="./ns:tipo"/>
<xsl:variable name="index">
<xsl:number level="single" count="node()[node()/ns:tipo=$tipoUnit]" format="1"/>
</xsl:variable>
<xsl:variable name="labelPath">
<xsl:apply-templates select="ancestor::ns:gruppo_logico"/>
<xsl:value-of select="$tipoUnit"/>
<xsl:value-of select="$open_bracket"/>
<xsl:value-of select="$index -1"/>
<xsl:value-of select="$closed_bracket"/>
</xsl:variable>
<xsl:copy>
<xsl:attribute name="labelPath"><xsl:value-of select="$labelPath" disable-output-escaping="yes"/></xsl:attribute>
<xsl:attribute name="unitIndex"><xsl:value-of select="$index" disable-output-escaping="yes"/></xsl:attribute>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<!-- just copy all my attributes and child nodes, except if there's a better template for some of them -->
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<!--template per rimuovere nodi vuoti-->
<xsl:template match="*[not(@*|*|comment()|processing-instruction()) and normalize-space()='']"/>
</xsl:stylesheet>


And the XML Doc which gaves different results in win and linux
XSLT:



<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns:dettaglioFormEKBSOUT xmlns:ns="http://new.webservice.namespace">
<ns:EKB_piatto>
<ns:campo_GL>
<ns:gruppo_logico tipo="Standard">
<ns:versione id="1">
<ns:contenuto>
<ns:riferimento_oi>
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.1</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
</ns:contenuto>
<ns:contenuto>
<ns:riferimento_oi>
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.2</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
</ns:contenuto>
</ns:versione>
</ns:gruppo_logico>
<ns:gruppo_logico tipo="Standard_due">
<ns:versione id="1">
<ns:contenuto>
<ns:riferimento_oi>
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.1</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
</ns:contenuto>
<ns:contenuto>
<ns:riferimento_oi>
<ns:tipo>Standard_due</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.2</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
</ns:contenuto>
</ns:versione>
</ns:gruppo_logico>
</ns:campo_GL>
</ns:EKB_piatto>
</ns:dettaglioFormEKBSOUT>


Linux output
This is the desired output which actually results from applying XSLT on Linux:



<?xml version="1.0"?>
<ns:flat_pallet xmlns:ns="http://new.webservice.namespace" tipo="">
<ns:riferimento_oi labelPath="Standard{0}/Standard{0}" unitIndex="1">
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.1</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
<ns:riferimento_oi labelPath="Standard{0}/Standard{1}" unitIndex="2">
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.2</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
<ns:riferimento_oi labelPath="Standard_due{0}/Standard{0}" unitIndex="1">
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.1</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
<ns:riferimento_oi labelPath="Standard_due{0}/Standard_due{0}" unitIndex="1">
<ns:tipo>Standard_due</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.2</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
</ns:flat_pallet>


Windows output
This is the wrong result produces on Windows:



<?xml version="1.0"?>
<ns:flat_pallet xmlns:ns="http://new.webservice.namespace" tipo="">
<ns:riferimento_oi labelPath="Standard{0}/Standard{0}" unitIndex="1">
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.1</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
<ns:riferimento_oi labelPath="Standard{0}/Standard{1}" unitIndex="2">
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.2</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
<ns:riferimento_oi labelPath="Standard_due{NaN}/Standard{0}" unitIndex="1">
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.1</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
<ns:riferimento_oi labelPath="Standard_due{NaN}/Standard_due{NaN}" unitIndex="">
<ns:tipo>Standard_due</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.2</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
</ns:flat_pallet>


The problem lies in the NaN put instead of relative index: it surely has to do with xsl:number element, but I can't figure out how to fix this...





Edit after accepted answer



By changing xsl:number count attribute to * instead of node() the xslt template works as expected on both Win and Linux.



Here's the updated code:



<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://new.webservice.namespace">
<xsl:output method="xml" version="1.0" indent="yes"/>
<xsl:param name="searchPath" select="11"/>
<xsl:variable name="slash" select="'/'"/>
<xsl:variable name="dot" select="'.'"/>
<xsl:variable name="open_bracket" select="'{'"/>
<xsl:variable name="closed_bracket" select="'}'"/>
<xsl:template match="/">
<ns:flat_pallet>
<xsl:attribute name="tipo"><xsl:value-of select="//ns:EKB_piatto/@tipo"/></xsl:attribute>
<xsl:apply-templates select=".//ns:gruppo_logico/ns:versione/ns:contenuto/ns:riferimento_oi"/>
</ns:flat_pallet>
</xsl:template>

<!--restituisco tipo del box e l'indice relativo a nel sottoalbero-->
<xsl:template match="ns:gruppo_logico">
<xsl:variable name="tipo">
<xsl:value-of select="@tipo"/>
</xsl:variable>
<xsl:variable name="index">
<xsl:number level="single" count="*[@tipo=$tipo]" format="1"/>
</xsl:variable>
<xsl:value-of select="normalize-space($tipo)" disable-output-escaping="yes"/>
<xsl:value-of select="$open_bracket"/>
<xsl:value-of select="$index -1" disable-output-escaping="yes"/>
<xsl:value-of select="$closed_bracket"/>
<xsl:value-of select="$slash"/>
</xsl:template>
<!--quando sono in una unit risalgo i box progenitori-->
<xsl:template match="ns:riferimento_oi">
<xsl:variable name="tipoUnit" select="./ns:tipo"/>
<xsl:variable name="index">
<xsl:number level="single" count="*[*/ns:tipo=$tipoUnit]" format="1"/>
</xsl:variable>
<xsl:variable name="labelPath">
<xsl:apply-templates select="ancestor::ns:gruppo_logico"/>
<xsl:value-of select="$tipoUnit"/>
<xsl:value-of select="$open_bracket"/>
<xsl:value-of select="$index -1"/>
<xsl:value-of select="$closed_bracket"/>
</xsl:variable>
<xsl:copy>
<xsl:attribute name="labelPath"><xsl:value-of select="$labelPath" disable-output-escaping="yes"/></xsl:attribute>
<xsl:attribute name="unitIndex"><xsl:value-of select="$index" disable-output-escaping="yes"/></xsl:attribute>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<!-- just copy all my attributes and child nodes, except if there's a better template for some of them -->
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<!--template per rimuovere nodi vuoti-->
<xsl:template match="*[not(@*|*|comment()|processing-instruction()) and normalize-space()='']"/>
</xsl:stylesheet>









share|improve this question

























  • I see no difference between the Linux and Windows outputs.

    – MonkeyZeus
    Nov 20 '18 at 17:39






  • 1





    This is very interesting! Issue can even be reproduced in xslt fiddle, toggling the engine between Saxon and others to "client-side processor".

    – Parfait
    Nov 20 '18 at 17:53






  • 1





    This would be much easier (and more useful to others) if the example were minimized to only what's necessary to show the problem - see: Minimal, Complete, and Verifiable example.

    – michael.hor257k
    Nov 21 '18 at 8:32






  • 1





    At xsltfiddle.liberty-development.net/6qVRKxe/2 I have tried to make a reduced test case, with Chrome (at least my current version 70.0.3538.102 on Windows 10 64-bit) it shows the problem. @nwellnhof, is that a bug in the Windows version of libxslt? I am having a hard time to find an up to date binary of xsltproc/libxslt for Windows to test myself.

    – Martin Honnen
    Nov 21 '18 at 10:18






  • 2





    For what it's worth, I tried the latest PHP release 7.2.12 on Windows which has the latest libxslt 1.1.32 and it exhibits the problem, so I have opened an issue on libxslt at gitlab.gnome.org/GNOME/libxslt/issues/6 to see whether they consider it a bug.

    – Martin Honnen
    Nov 21 '18 at 14:24














4












4








4


2






I've got this php snippet:



$xsltPath = $argv[1];
$xmlPath = $argv[2];

$xslt = file_get_contents($xsltPath);
$xml = file_get_contents($xmlPath);

$templateCMSObj = new DOMDocument();
$templateCMSObj->loadXML($xslt);
$ekbXMLObj = new DOMDocument();
$ekbXMLObj->loadXML($xml);
$proc = new XSLTProcessor();
$proc->importStylesheet($templateCMSObj);
$html = $proc->transformToXML($ekbXMLObj);
echo($html);
exit;


Which simply applies an XSLT to a given XML document.



When I apply the below XSLT to the same XML doc I got a different behaviour of Windows wrt to Linux PHP version.



Here's php and libxml version detail:



Windows:



PHP 7.1.6 (cli) (built: Jun  8 2017 02:06:32) ( ZTS MSVC14 (Visual C++ 2015) x86 )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies

XML Support => active
XML Namespace Support => active
libxml2 Version => 2.9.4
XMLReader => enabled
XMLWriter => enabled
XSL => enabled
libxslt Version => 1.1.29
libxslt compiled against libxml Version => 2.9.4
EXSLT => enabled
libexslt Version => 0.8.17


Linux:



PHP 7.0.32-1~dotdeb+8.1 (cli) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.0.32-1~dotdeb+8.1, Copyright (c) 1999-2017, by Zend Technologies
with Xdebug v2.5.5, Copyright (c) 2002-2017, by Derick Rethans

XML Support => active
XML Namespace Support => active
libxml2 Version => 2.9.1
XMLReader => enabled
XMLWriter => enabled
XSL => enabled
libxslt Version => 1.1.28
libxslt compiled against libxml Version => 2.9.1
EXSLT => enabled
libexslt Version => 1.1.28


Here's is the XSLT code:



<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://new.webservice.namespace">
<xsl:output method="xml" version="1.0" indent="yes"/>
<xsl:param name="searchPath" select="11"/>
<xsl:variable name="slash" select="'/'"/>
<xsl:variable name="dot" select="'.'"/>
<xsl:variable name="open_bracket" select="'{'"/>
<xsl:variable name="closed_bracket" select="'}'"/>
<xsl:template match="/">
<ns:flat_pallet>
<xsl:attribute name="tipo"><xsl:value-of select="//ns:EKB_piatto/@tipo"/></xsl:attribute>
<xsl:apply-templates select=".//ns:gruppo_logico/ns:versione/ns:contenuto/ns:riferimento_oi"/>
</ns:flat_pallet>
</xsl:template>

<!--restituisco tipo del box e l'indice relativo a nel sottoalbero-->
<xsl:template match="ns:gruppo_logico">
<xsl:variable name="tipo">
<xsl:value-of select="@tipo"/>
</xsl:variable>
<xsl:variable name="index">
<xsl:number level="single" count="node()[@tipo=$tipo]" format="1"/>
</xsl:variable>
<xsl:value-of select="normalize-space($tipo)" disable-output-escaping="yes"/>
<xsl:value-of select="$open_bracket"/>
<xsl:value-of select="$index -1" disable-output-escaping="yes"/>
<xsl:value-of select="$closed_bracket"/>
<xsl:value-of select="$slash"/>
</xsl:template>
<!--quando sono in una unit risalgo i box progenitori-->
<xsl:template match="ns:riferimento_oi">
<xsl:variable name="tipoUnit" select="./ns:tipo"/>
<xsl:variable name="index">
<xsl:number level="single" count="node()[node()/ns:tipo=$tipoUnit]" format="1"/>
</xsl:variable>
<xsl:variable name="labelPath">
<xsl:apply-templates select="ancestor::ns:gruppo_logico"/>
<xsl:value-of select="$tipoUnit"/>
<xsl:value-of select="$open_bracket"/>
<xsl:value-of select="$index -1"/>
<xsl:value-of select="$closed_bracket"/>
</xsl:variable>
<xsl:copy>
<xsl:attribute name="labelPath"><xsl:value-of select="$labelPath" disable-output-escaping="yes"/></xsl:attribute>
<xsl:attribute name="unitIndex"><xsl:value-of select="$index" disable-output-escaping="yes"/></xsl:attribute>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<!-- just copy all my attributes and child nodes, except if there's a better template for some of them -->
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<!--template per rimuovere nodi vuoti-->
<xsl:template match="*[not(@*|*|comment()|processing-instruction()) and normalize-space()='']"/>
</xsl:stylesheet>


And the XML Doc which gaves different results in win and linux
XSLT:



<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns:dettaglioFormEKBSOUT xmlns:ns="http://new.webservice.namespace">
<ns:EKB_piatto>
<ns:campo_GL>
<ns:gruppo_logico tipo="Standard">
<ns:versione id="1">
<ns:contenuto>
<ns:riferimento_oi>
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.1</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
</ns:contenuto>
<ns:contenuto>
<ns:riferimento_oi>
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.2</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
</ns:contenuto>
</ns:versione>
</ns:gruppo_logico>
<ns:gruppo_logico tipo="Standard_due">
<ns:versione id="1">
<ns:contenuto>
<ns:riferimento_oi>
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.1</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
</ns:contenuto>
<ns:contenuto>
<ns:riferimento_oi>
<ns:tipo>Standard_due</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.2</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
</ns:contenuto>
</ns:versione>
</ns:gruppo_logico>
</ns:campo_GL>
</ns:EKB_piatto>
</ns:dettaglioFormEKBSOUT>


Linux output
This is the desired output which actually results from applying XSLT on Linux:



<?xml version="1.0"?>
<ns:flat_pallet xmlns:ns="http://new.webservice.namespace" tipo="">
<ns:riferimento_oi labelPath="Standard{0}/Standard{0}" unitIndex="1">
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.1</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
<ns:riferimento_oi labelPath="Standard{0}/Standard{1}" unitIndex="2">
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.2</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
<ns:riferimento_oi labelPath="Standard_due{0}/Standard{0}" unitIndex="1">
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.1</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
<ns:riferimento_oi labelPath="Standard_due{0}/Standard_due{0}" unitIndex="1">
<ns:tipo>Standard_due</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.2</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
</ns:flat_pallet>


Windows output
This is the wrong result produces on Windows:



<?xml version="1.0"?>
<ns:flat_pallet xmlns:ns="http://new.webservice.namespace" tipo="">
<ns:riferimento_oi labelPath="Standard{0}/Standard{0}" unitIndex="1">
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.1</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
<ns:riferimento_oi labelPath="Standard{0}/Standard{1}" unitIndex="2">
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.2</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
<ns:riferimento_oi labelPath="Standard_due{NaN}/Standard{0}" unitIndex="1">
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.1</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
<ns:riferimento_oi labelPath="Standard_due{NaN}/Standard_due{NaN}" unitIndex="">
<ns:tipo>Standard_due</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.2</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
</ns:flat_pallet>


The problem lies in the NaN put instead of relative index: it surely has to do with xsl:number element, but I can't figure out how to fix this...





Edit after accepted answer



By changing xsl:number count attribute to * instead of node() the xslt template works as expected on both Win and Linux.



Here's the updated code:



<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://new.webservice.namespace">
<xsl:output method="xml" version="1.0" indent="yes"/>
<xsl:param name="searchPath" select="11"/>
<xsl:variable name="slash" select="'/'"/>
<xsl:variable name="dot" select="'.'"/>
<xsl:variable name="open_bracket" select="'{'"/>
<xsl:variable name="closed_bracket" select="'}'"/>
<xsl:template match="/">
<ns:flat_pallet>
<xsl:attribute name="tipo"><xsl:value-of select="//ns:EKB_piatto/@tipo"/></xsl:attribute>
<xsl:apply-templates select=".//ns:gruppo_logico/ns:versione/ns:contenuto/ns:riferimento_oi"/>
</ns:flat_pallet>
</xsl:template>

<!--restituisco tipo del box e l'indice relativo a nel sottoalbero-->
<xsl:template match="ns:gruppo_logico">
<xsl:variable name="tipo">
<xsl:value-of select="@tipo"/>
</xsl:variable>
<xsl:variable name="index">
<xsl:number level="single" count="*[@tipo=$tipo]" format="1"/>
</xsl:variable>
<xsl:value-of select="normalize-space($tipo)" disable-output-escaping="yes"/>
<xsl:value-of select="$open_bracket"/>
<xsl:value-of select="$index -1" disable-output-escaping="yes"/>
<xsl:value-of select="$closed_bracket"/>
<xsl:value-of select="$slash"/>
</xsl:template>
<!--quando sono in una unit risalgo i box progenitori-->
<xsl:template match="ns:riferimento_oi">
<xsl:variable name="tipoUnit" select="./ns:tipo"/>
<xsl:variable name="index">
<xsl:number level="single" count="*[*/ns:tipo=$tipoUnit]" format="1"/>
</xsl:variable>
<xsl:variable name="labelPath">
<xsl:apply-templates select="ancestor::ns:gruppo_logico"/>
<xsl:value-of select="$tipoUnit"/>
<xsl:value-of select="$open_bracket"/>
<xsl:value-of select="$index -1"/>
<xsl:value-of select="$closed_bracket"/>
</xsl:variable>
<xsl:copy>
<xsl:attribute name="labelPath"><xsl:value-of select="$labelPath" disable-output-escaping="yes"/></xsl:attribute>
<xsl:attribute name="unitIndex"><xsl:value-of select="$index" disable-output-escaping="yes"/></xsl:attribute>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<!-- just copy all my attributes and child nodes, except if there's a better template for some of them -->
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<!--template per rimuovere nodi vuoti-->
<xsl:template match="*[not(@*|*|comment()|processing-instruction()) and normalize-space()='']"/>
</xsl:stylesheet>









share|improve this question
















I've got this php snippet:



$xsltPath = $argv[1];
$xmlPath = $argv[2];

$xslt = file_get_contents($xsltPath);
$xml = file_get_contents($xmlPath);

$templateCMSObj = new DOMDocument();
$templateCMSObj->loadXML($xslt);
$ekbXMLObj = new DOMDocument();
$ekbXMLObj->loadXML($xml);
$proc = new XSLTProcessor();
$proc->importStylesheet($templateCMSObj);
$html = $proc->transformToXML($ekbXMLObj);
echo($html);
exit;


Which simply applies an XSLT to a given XML document.



When I apply the below XSLT to the same XML doc I got a different behaviour of Windows wrt to Linux PHP version.



Here's php and libxml version detail:



Windows:



PHP 7.1.6 (cli) (built: Jun  8 2017 02:06:32) ( ZTS MSVC14 (Visual C++ 2015) x86 )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies

XML Support => active
XML Namespace Support => active
libxml2 Version => 2.9.4
XMLReader => enabled
XMLWriter => enabled
XSL => enabled
libxslt Version => 1.1.29
libxslt compiled against libxml Version => 2.9.4
EXSLT => enabled
libexslt Version => 0.8.17


Linux:



PHP 7.0.32-1~dotdeb+8.1 (cli) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.0.32-1~dotdeb+8.1, Copyright (c) 1999-2017, by Zend Technologies
with Xdebug v2.5.5, Copyright (c) 2002-2017, by Derick Rethans

XML Support => active
XML Namespace Support => active
libxml2 Version => 2.9.1
XMLReader => enabled
XMLWriter => enabled
XSL => enabled
libxslt Version => 1.1.28
libxslt compiled against libxml Version => 2.9.1
EXSLT => enabled
libexslt Version => 1.1.28


Here's is the XSLT code:



<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://new.webservice.namespace">
<xsl:output method="xml" version="1.0" indent="yes"/>
<xsl:param name="searchPath" select="11"/>
<xsl:variable name="slash" select="'/'"/>
<xsl:variable name="dot" select="'.'"/>
<xsl:variable name="open_bracket" select="'{'"/>
<xsl:variable name="closed_bracket" select="'}'"/>
<xsl:template match="/">
<ns:flat_pallet>
<xsl:attribute name="tipo"><xsl:value-of select="//ns:EKB_piatto/@tipo"/></xsl:attribute>
<xsl:apply-templates select=".//ns:gruppo_logico/ns:versione/ns:contenuto/ns:riferimento_oi"/>
</ns:flat_pallet>
</xsl:template>

<!--restituisco tipo del box e l'indice relativo a nel sottoalbero-->
<xsl:template match="ns:gruppo_logico">
<xsl:variable name="tipo">
<xsl:value-of select="@tipo"/>
</xsl:variable>
<xsl:variable name="index">
<xsl:number level="single" count="node()[@tipo=$tipo]" format="1"/>
</xsl:variable>
<xsl:value-of select="normalize-space($tipo)" disable-output-escaping="yes"/>
<xsl:value-of select="$open_bracket"/>
<xsl:value-of select="$index -1" disable-output-escaping="yes"/>
<xsl:value-of select="$closed_bracket"/>
<xsl:value-of select="$slash"/>
</xsl:template>
<!--quando sono in una unit risalgo i box progenitori-->
<xsl:template match="ns:riferimento_oi">
<xsl:variable name="tipoUnit" select="./ns:tipo"/>
<xsl:variable name="index">
<xsl:number level="single" count="node()[node()/ns:tipo=$tipoUnit]" format="1"/>
</xsl:variable>
<xsl:variable name="labelPath">
<xsl:apply-templates select="ancestor::ns:gruppo_logico"/>
<xsl:value-of select="$tipoUnit"/>
<xsl:value-of select="$open_bracket"/>
<xsl:value-of select="$index -1"/>
<xsl:value-of select="$closed_bracket"/>
</xsl:variable>
<xsl:copy>
<xsl:attribute name="labelPath"><xsl:value-of select="$labelPath" disable-output-escaping="yes"/></xsl:attribute>
<xsl:attribute name="unitIndex"><xsl:value-of select="$index" disable-output-escaping="yes"/></xsl:attribute>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<!-- just copy all my attributes and child nodes, except if there's a better template for some of them -->
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<!--template per rimuovere nodi vuoti-->
<xsl:template match="*[not(@*|*|comment()|processing-instruction()) and normalize-space()='']"/>
</xsl:stylesheet>


And the XML Doc which gaves different results in win and linux
XSLT:



<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns:dettaglioFormEKBSOUT xmlns:ns="http://new.webservice.namespace">
<ns:EKB_piatto>
<ns:campo_GL>
<ns:gruppo_logico tipo="Standard">
<ns:versione id="1">
<ns:contenuto>
<ns:riferimento_oi>
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.1</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
</ns:contenuto>
<ns:contenuto>
<ns:riferimento_oi>
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.2</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
</ns:contenuto>
</ns:versione>
</ns:gruppo_logico>
<ns:gruppo_logico tipo="Standard_due">
<ns:versione id="1">
<ns:contenuto>
<ns:riferimento_oi>
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.1</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
</ns:contenuto>
<ns:contenuto>
<ns:riferimento_oi>
<ns:tipo>Standard_due</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.2</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
</ns:contenuto>
</ns:versione>
</ns:gruppo_logico>
</ns:campo_GL>
</ns:EKB_piatto>
</ns:dettaglioFormEKBSOUT>


Linux output
This is the desired output which actually results from applying XSLT on Linux:



<?xml version="1.0"?>
<ns:flat_pallet xmlns:ns="http://new.webservice.namespace" tipo="">
<ns:riferimento_oi labelPath="Standard{0}/Standard{0}" unitIndex="1">
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.1</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
<ns:riferimento_oi labelPath="Standard{0}/Standard{1}" unitIndex="2">
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.2</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
<ns:riferimento_oi labelPath="Standard_due{0}/Standard{0}" unitIndex="1">
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.1</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
<ns:riferimento_oi labelPath="Standard_due{0}/Standard_due{0}" unitIndex="1">
<ns:tipo>Standard_due</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.2</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
</ns:flat_pallet>


Windows output
This is the wrong result produces on Windows:



<?xml version="1.0"?>
<ns:flat_pallet xmlns:ns="http://new.webservice.namespace" tipo="">
<ns:riferimento_oi labelPath="Standard{0}/Standard{0}" unitIndex="1">
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.1</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
<ns:riferimento_oi labelPath="Standard{0}/Standard{1}" unitIndex="2">
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.2</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
<ns:riferimento_oi labelPath="Standard_due{NaN}/Standard{0}" unitIndex="1">
<ns:tipo>Standard</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.1</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
<ns:riferimento_oi labelPath="Standard_due{NaN}/Standard_due{NaN}" unitIndex="">
<ns:tipo>Standard_due</ns:tipo>
<ns:natura_OI>
<ns:UNI>2.2</ns:UNI>
</ns:natura_OI>
</ns:riferimento_oi>
</ns:flat_pallet>


The problem lies in the NaN put instead of relative index: it surely has to do with xsl:number element, but I can't figure out how to fix this...





Edit after accepted answer



By changing xsl:number count attribute to * instead of node() the xslt template works as expected on both Win and Linux.



Here's the updated code:



<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://new.webservice.namespace">
<xsl:output method="xml" version="1.0" indent="yes"/>
<xsl:param name="searchPath" select="11"/>
<xsl:variable name="slash" select="'/'"/>
<xsl:variable name="dot" select="'.'"/>
<xsl:variable name="open_bracket" select="'{'"/>
<xsl:variable name="closed_bracket" select="'}'"/>
<xsl:template match="/">
<ns:flat_pallet>
<xsl:attribute name="tipo"><xsl:value-of select="//ns:EKB_piatto/@tipo"/></xsl:attribute>
<xsl:apply-templates select=".//ns:gruppo_logico/ns:versione/ns:contenuto/ns:riferimento_oi"/>
</ns:flat_pallet>
</xsl:template>

<!--restituisco tipo del box e l'indice relativo a nel sottoalbero-->
<xsl:template match="ns:gruppo_logico">
<xsl:variable name="tipo">
<xsl:value-of select="@tipo"/>
</xsl:variable>
<xsl:variable name="index">
<xsl:number level="single" count="*[@tipo=$tipo]" format="1"/>
</xsl:variable>
<xsl:value-of select="normalize-space($tipo)" disable-output-escaping="yes"/>
<xsl:value-of select="$open_bracket"/>
<xsl:value-of select="$index -1" disable-output-escaping="yes"/>
<xsl:value-of select="$closed_bracket"/>
<xsl:value-of select="$slash"/>
</xsl:template>
<!--quando sono in una unit risalgo i box progenitori-->
<xsl:template match="ns:riferimento_oi">
<xsl:variable name="tipoUnit" select="./ns:tipo"/>
<xsl:variable name="index">
<xsl:number level="single" count="*[*/ns:tipo=$tipoUnit]" format="1"/>
</xsl:variable>
<xsl:variable name="labelPath">
<xsl:apply-templates select="ancestor::ns:gruppo_logico"/>
<xsl:value-of select="$tipoUnit"/>
<xsl:value-of select="$open_bracket"/>
<xsl:value-of select="$index -1"/>
<xsl:value-of select="$closed_bracket"/>
</xsl:variable>
<xsl:copy>
<xsl:attribute name="labelPath"><xsl:value-of select="$labelPath" disable-output-escaping="yes"/></xsl:attribute>
<xsl:attribute name="unitIndex"><xsl:value-of select="$index" disable-output-escaping="yes"/></xsl:attribute>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<!-- just copy all my attributes and child nodes, except if there's a better template for some of them -->
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<!--template per rimuovere nodi vuoti-->
<xsl:template match="*[not(@*|*|comment()|processing-instruction()) and normalize-space()='']"/>
</xsl:stylesheet>






php xml xslt xslt-1.0 libxslt






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 21 '18 at 11:11









Martin Honnen

111k65976




111k65976










asked Nov 20 '18 at 17:30









lbruttilbrutti

8191112




8191112













  • I see no difference between the Linux and Windows outputs.

    – MonkeyZeus
    Nov 20 '18 at 17:39






  • 1





    This is very interesting! Issue can even be reproduced in xslt fiddle, toggling the engine between Saxon and others to "client-side processor".

    – Parfait
    Nov 20 '18 at 17:53






  • 1





    This would be much easier (and more useful to others) if the example were minimized to only what's necessary to show the problem - see: Minimal, Complete, and Verifiable example.

    – michael.hor257k
    Nov 21 '18 at 8:32






  • 1





    At xsltfiddle.liberty-development.net/6qVRKxe/2 I have tried to make a reduced test case, with Chrome (at least my current version 70.0.3538.102 on Windows 10 64-bit) it shows the problem. @nwellnhof, is that a bug in the Windows version of libxslt? I am having a hard time to find an up to date binary of xsltproc/libxslt for Windows to test myself.

    – Martin Honnen
    Nov 21 '18 at 10:18






  • 2





    For what it's worth, I tried the latest PHP release 7.2.12 on Windows which has the latest libxslt 1.1.32 and it exhibits the problem, so I have opened an issue on libxslt at gitlab.gnome.org/GNOME/libxslt/issues/6 to see whether they consider it a bug.

    – Martin Honnen
    Nov 21 '18 at 14:24



















  • I see no difference between the Linux and Windows outputs.

    – MonkeyZeus
    Nov 20 '18 at 17:39






  • 1





    This is very interesting! Issue can even be reproduced in xslt fiddle, toggling the engine between Saxon and others to "client-side processor".

    – Parfait
    Nov 20 '18 at 17:53






  • 1





    This would be much easier (and more useful to others) if the example were minimized to only what's necessary to show the problem - see: Minimal, Complete, and Verifiable example.

    – michael.hor257k
    Nov 21 '18 at 8:32






  • 1





    At xsltfiddle.liberty-development.net/6qVRKxe/2 I have tried to make a reduced test case, with Chrome (at least my current version 70.0.3538.102 on Windows 10 64-bit) it shows the problem. @nwellnhof, is that a bug in the Windows version of libxslt? I am having a hard time to find an up to date binary of xsltproc/libxslt for Windows to test myself.

    – Martin Honnen
    Nov 21 '18 at 10:18






  • 2





    For what it's worth, I tried the latest PHP release 7.2.12 on Windows which has the latest libxslt 1.1.32 and it exhibits the problem, so I have opened an issue on libxslt at gitlab.gnome.org/GNOME/libxslt/issues/6 to see whether they consider it a bug.

    – Martin Honnen
    Nov 21 '18 at 14:24

















I see no difference between the Linux and Windows outputs.

– MonkeyZeus
Nov 20 '18 at 17:39





I see no difference between the Linux and Windows outputs.

– MonkeyZeus
Nov 20 '18 at 17:39




1




1





This is very interesting! Issue can even be reproduced in xslt fiddle, toggling the engine between Saxon and others to "client-side processor".

– Parfait
Nov 20 '18 at 17:53





This is very interesting! Issue can even be reproduced in xslt fiddle, toggling the engine between Saxon and others to "client-side processor".

– Parfait
Nov 20 '18 at 17:53




1




1





This would be much easier (and more useful to others) if the example were minimized to only what's necessary to show the problem - see: Minimal, Complete, and Verifiable example.

– michael.hor257k
Nov 21 '18 at 8:32





This would be much easier (and more useful to others) if the example were minimized to only what's necessary to show the problem - see: Minimal, Complete, and Verifiable example.

– michael.hor257k
Nov 21 '18 at 8:32




1




1





At xsltfiddle.liberty-development.net/6qVRKxe/2 I have tried to make a reduced test case, with Chrome (at least my current version 70.0.3538.102 on Windows 10 64-bit) it shows the problem. @nwellnhof, is that a bug in the Windows version of libxslt? I am having a hard time to find an up to date binary of xsltproc/libxslt for Windows to test myself.

– Martin Honnen
Nov 21 '18 at 10:18





At xsltfiddle.liberty-development.net/6qVRKxe/2 I have tried to make a reduced test case, with Chrome (at least my current version 70.0.3538.102 on Windows 10 64-bit) it shows the problem. @nwellnhof, is that a bug in the Windows version of libxslt? I am having a hard time to find an up to date binary of xsltproc/libxslt for Windows to test myself.

– Martin Honnen
Nov 21 '18 at 10:18




2




2





For what it's worth, I tried the latest PHP release 7.2.12 on Windows which has the latest libxslt 1.1.32 and it exhibits the problem, so I have opened an issue on libxslt at gitlab.gnome.org/GNOME/libxslt/issues/6 to see whether they consider it a bug.

– Martin Honnen
Nov 21 '18 at 14:24





For what it's worth, I tried the latest PHP release 7.2.12 on Windows which has the latest libxslt 1.1.32 and it exhibits the problem, so I have opened an issue on libxslt at gitlab.gnome.org/GNOME/libxslt/issues/6 to see whether they consider it a bug.

– Martin Honnen
Nov 21 '18 at 14:24












1 Answer
1






active

oldest

votes


















3














In the select attribute of xsl:number, use * instead of node().



When you use node(), that can be an element, text, comment, or processing instruction node.



When you use *, that's only an element. That makes more sense in your use of xsl:number.



See https://xsltfiddle.liberty-development.net/nc4NzRq/1 for a working fiddle. (Thanks @parfait!)






share|improve this answer
























  • And so this use of node() can differ across XSLT engines?

    – Parfait
    Nov 20 '18 at 18:39






  • 2





    @Parfait, I would say it is a bug in libxslt in that particular PHP or Chrome version, not sure whether it is OS related or not. Both Chrome and PHP use libxslt for XSLT processing, so it is not surprising the XSLT problem occurs in PHP and Chrome.

    – Martin Honnen
    Nov 20 '18 at 21:39











  • Indeed @MartinHonnen. Chrome was the only browser that I could replicate the NaN behavior. And interestingly, the bug is OS-dependent. Modules in Perl, Python, even R (much of the open source) uses libxslt. Bugs can be reported via bugzilla, with some entries for xsl:number.

    – Parfait
    Nov 20 '18 at 22:40











  • thank, i'll try and let you know

    – lbrutti
    Nov 21 '18 at 8:24











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53398425%2fphp-different-behaviour-of-xslt-processor-in-windows-wrt-to-linux%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









3














In the select attribute of xsl:number, use * instead of node().



When you use node(), that can be an element, text, comment, or processing instruction node.



When you use *, that's only an element. That makes more sense in your use of xsl:number.



See https://xsltfiddle.liberty-development.net/nc4NzRq/1 for a working fiddle. (Thanks @parfait!)






share|improve this answer
























  • And so this use of node() can differ across XSLT engines?

    – Parfait
    Nov 20 '18 at 18:39






  • 2





    @Parfait, I would say it is a bug in libxslt in that particular PHP or Chrome version, not sure whether it is OS related or not. Both Chrome and PHP use libxslt for XSLT processing, so it is not surprising the XSLT problem occurs in PHP and Chrome.

    – Martin Honnen
    Nov 20 '18 at 21:39











  • Indeed @MartinHonnen. Chrome was the only browser that I could replicate the NaN behavior. And interestingly, the bug is OS-dependent. Modules in Perl, Python, even R (much of the open source) uses libxslt. Bugs can be reported via bugzilla, with some entries for xsl:number.

    – Parfait
    Nov 20 '18 at 22:40











  • thank, i'll try and let you know

    – lbrutti
    Nov 21 '18 at 8:24
















3














In the select attribute of xsl:number, use * instead of node().



When you use node(), that can be an element, text, comment, or processing instruction node.



When you use *, that's only an element. That makes more sense in your use of xsl:number.



See https://xsltfiddle.liberty-development.net/nc4NzRq/1 for a working fiddle. (Thanks @parfait!)






share|improve this answer
























  • And so this use of node() can differ across XSLT engines?

    – Parfait
    Nov 20 '18 at 18:39






  • 2





    @Parfait, I would say it is a bug in libxslt in that particular PHP or Chrome version, not sure whether it is OS related or not. Both Chrome and PHP use libxslt for XSLT processing, so it is not surprising the XSLT problem occurs in PHP and Chrome.

    – Martin Honnen
    Nov 20 '18 at 21:39











  • Indeed @MartinHonnen. Chrome was the only browser that I could replicate the NaN behavior. And interestingly, the bug is OS-dependent. Modules in Perl, Python, even R (much of the open source) uses libxslt. Bugs can be reported via bugzilla, with some entries for xsl:number.

    – Parfait
    Nov 20 '18 at 22:40











  • thank, i'll try and let you know

    – lbrutti
    Nov 21 '18 at 8:24














3












3








3







In the select attribute of xsl:number, use * instead of node().



When you use node(), that can be an element, text, comment, or processing instruction node.



When you use *, that's only an element. That makes more sense in your use of xsl:number.



See https://xsltfiddle.liberty-development.net/nc4NzRq/1 for a working fiddle. (Thanks @parfait!)






share|improve this answer













In the select attribute of xsl:number, use * instead of node().



When you use node(), that can be an element, text, comment, or processing instruction node.



When you use *, that's only an element. That makes more sense in your use of xsl:number.



See https://xsltfiddle.liberty-development.net/nc4NzRq/1 for a working fiddle. (Thanks @parfait!)







share|improve this answer












share|improve this answer



share|improve this answer










answered Nov 20 '18 at 18:33









Daniel HaleyDaniel Haley

38.7k45380




38.7k45380













  • And so this use of node() can differ across XSLT engines?

    – Parfait
    Nov 20 '18 at 18:39






  • 2





    @Parfait, I would say it is a bug in libxslt in that particular PHP or Chrome version, not sure whether it is OS related or not. Both Chrome and PHP use libxslt for XSLT processing, so it is not surprising the XSLT problem occurs in PHP and Chrome.

    – Martin Honnen
    Nov 20 '18 at 21:39











  • Indeed @MartinHonnen. Chrome was the only browser that I could replicate the NaN behavior. And interestingly, the bug is OS-dependent. Modules in Perl, Python, even R (much of the open source) uses libxslt. Bugs can be reported via bugzilla, with some entries for xsl:number.

    – Parfait
    Nov 20 '18 at 22:40











  • thank, i'll try and let you know

    – lbrutti
    Nov 21 '18 at 8:24



















  • And so this use of node() can differ across XSLT engines?

    – Parfait
    Nov 20 '18 at 18:39






  • 2





    @Parfait, I would say it is a bug in libxslt in that particular PHP or Chrome version, not sure whether it is OS related or not. Both Chrome and PHP use libxslt for XSLT processing, so it is not surprising the XSLT problem occurs in PHP and Chrome.

    – Martin Honnen
    Nov 20 '18 at 21:39











  • Indeed @MartinHonnen. Chrome was the only browser that I could replicate the NaN behavior. And interestingly, the bug is OS-dependent. Modules in Perl, Python, even R (much of the open source) uses libxslt. Bugs can be reported via bugzilla, with some entries for xsl:number.

    – Parfait
    Nov 20 '18 at 22:40











  • thank, i'll try and let you know

    – lbrutti
    Nov 21 '18 at 8:24

















And so this use of node() can differ across XSLT engines?

– Parfait
Nov 20 '18 at 18:39





And so this use of node() can differ across XSLT engines?

– Parfait
Nov 20 '18 at 18:39




2




2





@Parfait, I would say it is a bug in libxslt in that particular PHP or Chrome version, not sure whether it is OS related or not. Both Chrome and PHP use libxslt for XSLT processing, so it is not surprising the XSLT problem occurs in PHP and Chrome.

– Martin Honnen
Nov 20 '18 at 21:39





@Parfait, I would say it is a bug in libxslt in that particular PHP or Chrome version, not sure whether it is OS related or not. Both Chrome and PHP use libxslt for XSLT processing, so it is not surprising the XSLT problem occurs in PHP and Chrome.

– Martin Honnen
Nov 20 '18 at 21:39













Indeed @MartinHonnen. Chrome was the only browser that I could replicate the NaN behavior. And interestingly, the bug is OS-dependent. Modules in Perl, Python, even R (much of the open source) uses libxslt. Bugs can be reported via bugzilla, with some entries for xsl:number.

– Parfait
Nov 20 '18 at 22:40





Indeed @MartinHonnen. Chrome was the only browser that I could replicate the NaN behavior. And interestingly, the bug is OS-dependent. Modules in Perl, Python, even R (much of the open source) uses libxslt. Bugs can be reported via bugzilla, with some entries for xsl:number.

– Parfait
Nov 20 '18 at 22:40













thank, i'll try and let you know

– lbrutti
Nov 21 '18 at 8:24





thank, i'll try and let you know

– lbrutti
Nov 21 '18 at 8:24


















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53398425%2fphp-different-behaviour-of-xslt-processor-in-windows-wrt-to-linux%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

android studio warns about leanback feature tag usage required on manifest while using Unity exported app?

SQL update select statement

'app-layout' is not a known element: how to share Component with different Modules