How to extract value from json object in xslt mapping

87 views Asked by At

I have the below json file

sample.json

{
    "books": [
        {
            "test": {
                "count": 1
            },
            "Name": "C",
            "Type": "String"
        },
        {
            "test": {
                "count": 2
            },
            "Name": "C++",
            "Type": "String"
        }
    ]
}

I have to extract the "Name" field value in xslt. If I am removing the test block, it's working fine. but with test block I am getting empty result.

I have tried with below xslt sample.xslt

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:mf="http://www.example.com/mf"
  exclude-result-prefixes="#all"
  expand-text="yes">
  
  <xsl:output method="json" indent="yes"/>

  <xsl:function name="mf:apply-templates" as="item()*">
    <xsl:param name="items" as="item()*"/>
    <xsl:apply-templates select="$items"/>
  </xsl:function>

   <xsl:template match="." name="xsl:initial-template">
    <xsl:sequence select="array { mf:apply-templates(?books?*) }"/>
   
  </xsl:template> 
  
   
  
  <xsl:template match=".[. instance of map(xs:string, xs:anyAtomicType)]">
    <xsl:map>
        <xsl:map-entry key="'resourceType'" select="'Test'"/>
        
        <xsl:map-entry key="'identifier'">

                        <xsl:map>
                            <xsl:map-entry key="'name'"
                                select="?Name" />
                                </xsl:map>
                            </xsl:map-entry>
      
    </xsl:map>
  </xsl:template>
  
</xsl:stylesheet>

Desired Output should be as below:

output.json

[
  {
    "resourceType": "Test",
    "identifier": { "name":"C" }
  },
  {
    "resourceType": "Test",
    "identifier": { "name":"C++" }
  }
]
2

There are 2 answers

1
Martin Honnen On BEST ANSWER

You can use

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="#all">
  
  <xsl:output method="json" indent="yes"/>

   <xsl:template match="." name="xsl:initial-template">
    <xsl:sequence 
      select="array { 
                ?books?* ! map {
                  'resourceType' : 'Test',
                  'indentifier' : map { 'name' : ?Name }
                }
              }"/>
  </xsl:template> 
  
</xsl:stylesheet>
1
Balaji Venkatraman On

We just need few adjustments here,

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0"
  exclude-result-prefixes="#all"
  expand-text="yes">
  
  <xsl:output method="json" indent="yes"/>

  <xsl:template match="/" name="xsl:initial-template">
    <xsl:sequence select="array { mf:apply-templates(json-doc('sample.json')?books?*) }"/>
  </xsl:template> 
  
  <xsl:template match=".[. instance of map(xs:string, xs:anyAtomicType)]">
    <xsl:map>
      <xsl:map-entry key="'resourceType'" select="'Test'"/>
      <xsl:map-entry key="'identifier'">
        <xsl:map>
          <xsl:map-entry key="'name'" select="string(?Name)" />
        </xsl:map>
      </xsl:map-entry>
    </xsl:map>
  </xsl:template>

</xsl:stylesheet>