- From: Martin Honnen <martin.honnen@gmx.de>
- Date: Sun, 10 Aug 2025 21:57:59 +0200
- To: public-xslt-40@w3.org
On 10/08/2025 19:44, Mukul Gandhi wrote:
>
> I've a question about XPath 3.1 function fn:json-to-xml and its
> duplicates resolution option 'retain', where all the XDM map's keys
> with same name have to be available within fn:json-to-xml's XML result
> serialization.
>
> Please consider following XSLT 3.0 stylesheet example using XPath 3.1
> function fn:json-to-xml.
>
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> xmlns:xs="http://www.w3.org/2001/XMLSchema"
> exclude-result-prefixes="xs"
> version="3.0">
> <xsl:output method="xml" indent="yes"/>
>
> <xsl:variable name="jsonStr" as="xs:string">
> { "a" : 1,
> "b" : {"x" : 10, "y" : 11, "x" : 12},
> "b" : 3,
> "a" : 4
> }
> </xsl:variable>
>
> <xsl:template match="/">
> <xsl:sequence select="json-to-xml($jsonStr, map{'duplicates' :
> 'retain'})"/>
> </xsl:template>
>
> </xsl:stylesheet>
>
> Saxon-HE 12.5 XSLT 3.0 processor emits following XSL transform output
> for this stylesheet:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <map xmlns="http://www.w3.org/2005/xpath-functions">
> <number key="a">1</number>
> <map key="b">
> <number key="x">10</number>
> <number key="y">11</number>
> <number key="x">12</number>
> </map>
> <number key="b">3</number>
> <number key="a">4</number>
> </map>
>
> Whereas, Apache Xalan-J's XSLT 3.0 development code, for this
> stylesheet produces following result:
>
> <?xml version="1.0" encoding="UTF-8"?><map
> xmlns="http://www.w3.org/2005/xpath-functions">
> <number key="a">1</number>
> <number key="a">4</number>
> <map key="b">
> <number key="x">10</number>
> <number key="x">12</number>
> <number key="y">11</number>
> </map>
> <number key="b">3</number>
> </map>
>
> I think, that both of above mentioned XSL transformation results for
> the two mentioned XSLT processors looks similar, but they're not
> exactly same.
>
> Saxon's XSL transformation result for this example, follows XDM map's
> key order sequence as present within JSON input document, whereas,
> Xalan-J's XSL transformation result has XDM map keys with same name
> adjacent to each other.
>
> My question is, whether Xalan-J's result for this XSL stylesheet
> example, compliant to XPath 3.1 spec for the function fn:json-to-xml?
>
> Many thanks in advance for any answers.
>
I would say the relevant section of the spec
https://www.w3.org/TR/xpath-functions-31/#json-to-xml-mapping says:
A JSON object is represented by an element named map. The content is a
sequence of child elements each of which represents one of the
name/value pairs in the object. The representation of the name/value
pair N:V is obtained by taking the element that represents the value V
(by applying these rules recursively) and adding an attribute with name
key (in no namespace), whose value is N as an instance of xs:string. The
functions fn:json-to-xml and fn:xml-to-json both retain the order of
entries, subject to rules about how duplicate keys are handled.
I would interpret that as retaining the order of the entries (name/value
pairs) if all duplicates are retained, so based on that the result Xalan
gives breaks the rule to retain the order of entries.
I will try to check the existing XPath 3.1 test suite for test cases
that perhaps cover that case.
Received on Sunday, 10 August 2025 19:58:06 UTC