I just start this search JSON in different databases and transform:
/doc1.json:
{
"seller": "s1",
"product": [
"football",
"basketball"
],
"sales": [
{
"football": 60,
"basketball": [
{
"c1": 76,
"c2": 90
}
]
}
]
}
/doc2.json
{
"seller": "s2",
"product": ["football"],
"sales": [
{"football": 80}
]
}
I find the product only contains one specific item (I will be better if JavaScript), merged with sales, and transform the result as XML (using XSLT ?). But I didn’t get very far. First, I try MarkLogic JS:
cts.search(cts.jsonPropertyValueQuery('product', 'football'))
and many other methods, it always returns 2 docs. I need to use module function instead of hardcoded JSON value.
Thanks in advance for any help.
var doc = cts.doc("/doc1.json");
var foo = fn.head(xdmp.unquote(
`
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"\n\
version="2.0">\n\
<xsl:template match="/">\n\
<root>\n\
<xsl:element name="products">\n\
<xsl:for-each select="product">\n\
<xsl:element name="product">\n\
<xsl:variable name="value" select="."/>\n\
<xsl:value-of select="."/>\n\
<xsl:element name="sales">\n\
<xsl:for-each select="/sales/*[name() = $value]">\n\
<xsl:copy select="."/>\n\
</xsl:for-each>\n\
</xsl:element>\n\
</xsl:element>\n\
</xsl:for-each>\n\
</xsl:element>\n\
</root>\n\
</xsl:template>\n\
<xsl:template match="@*|node()">\n\
<xsl:copy>\n\
<xsl:apply-templates select="@*|node()"/>\n\
</xsl:copy>\n\
</xsl:template>\n\
</xsl:transform>\n\
`));
xdmp.xsltEval(foo, doc);
/doc2.json should be :
<root>
<products>
<product>football<sales>80</sales>
</product>
</products>
</root>
/doc1.json should be :
<root>
<products>
<product>football<sales>60</sales></product>
<product>basketball<sales>
<c1>76</c1>
<c2>90</c2>
</sales></product>
</products>
</root>