Search code examples
xsltxslt-2.0

Not able to read xml data through xslt


I was trying to read the xml data from input xml, but I am getting empty result in the xml, I am not able to understand where I did mistake and any issue with input xml. The main goal is to change the data of the Organisation information in this, but for the first step itself I am not able to read the data in the xml

Input:

<?xml version="1.0" encoding="utf-8"?>
<entities xmlns="http://schemas.ockhm.com/api/1/">
    <record source="system" key="53071236" revision="1234" status="valid" type="person">
        <member>
            <source>L002</source>
            <key>442</key>
        </member>
        <member>
            <source>L002</source>
            <key>027</key>
        </member>
        <member>
            <source>L002</source>
            <key>071</key>
        </member>
        <member>
            <source>L002</source>
            <key>0930</key>
        </member>
      <person status="valid">
            <gender>male</gender>
            <form_of_address>Mr.</form_of_address>
            <qualification_preceding>Dr.</qualification_preceding>
            <given_names_full>john</given_names_full>
            <surname_first>test</surname_first>
            <origin>
                <source>L002</source>
                <key>442</key>
            </origin>
            <origin>
                <source>L002</source>
                <key>027</key>
            </origin>
            <origin>
                <source>L002</source>
                <key>0071</key>
            </origin>
            <origin>
                <source>L002</source>
                <key>0930</key>
            </origin>    
        </person>
        <organization status="valid">
            <name>Test college</name>
            <department>test one Institute</department>
            <origin>
                <source>L002</source>
                <key>027</key>
            </origin>
            <origin>
                <source>L002</source>
                <key>442</key>
            </origin>
            <origin>
                <source>L002</source>
                <key>0930</key>
            </origin>
        </organization>
        <organization status="valid">
            <name>Test king INST.</name>
            <department>PHARMA</department>
            <origin>
                <source>L002</source>
                <key>132</key>
            </origin>
        </organization>
        <alias status="valid">
            <alias7>732</alias7>
            <origin>
                <source>L002</source>
                <key>9442</key>
            </origin>
        </alias>
        <alias status="valid">
            <alias7>33</alias7>
            <origin>
                <source>L002</source>
                <key>027</key>
            </origin>
        </alias>
        <create_user status="valid">
            <create_user>572</create_user>
            <origin>
                <source>L002</source>
                <key>027</key>
            </origin>
            <origin>
                <source>L002</source>
                <key>071</key>
            </origin>
            <origin>
                <source>L002</source>
                <key>930</key>
            </origin>
        </create_user>
        <bp_type status="valid">
            <bp_type>customers</bp_type>
            <origin>
                <source>CRM</source>
                <key>10082</key>
            </origin>
            <origin>
                <source>CRM</source>
                <key>93</key>
            </origin>
        </bp_type>
        <bp_type status="valid">
            <bp_type>teachers</bp_type>
            <origin>
                <source>CRM</source>
                <key>6128</key>
            </origin>
            <origin>
                <source>CRM</source>
                <key>775</key>
            </origin>
            <origin>
                <source>CRM</source>
                <key>029</key>
            </origin>
        </bp_type>
        <head_of_account status="valid">
            <head_of_account>P</head_of_account>
            <origin>
                <source>CRM</source>
                <key>451</key>
            </origin>
        </head_of_account>
        <head_of_account status="valid">
            <head_of_account>D</head_of_account>
            <origin>
                <source>CRM</source>
                <key>128</key>
            </origin>
            <origin>
                <source>CRM</source>
                <key>775</key>
            </origin>
            <origin>
                <source>CRM</source>
                <key>029</key>
            </origin>
        </head_of_account>
        <postal_address status="valid">
            <type>XXDEFAULT</type>
            <str>xx street</str>
            <hno>8</hno>
            <zip>zip1234</zip>
            <city>city123</city>
            <country_code>gh</country_code>
            <zip_add_on>1P</zip_add_on>
            <origin>
                <source>L002</source>
                <key>071</key>
            </origin>
            <origin>
                <source>L002</source>
                <key>764</key>
            </origin>
        </postal_address>
        
        
        <email_address status="valid">
            <type>work</type>
            <address>jp address</address>
            <origin>
                <source>CRM</source>
                <key>128</key>
                <id>655</id>
            </origin>
        </email_address>
        <external_numbers status="valid">
            <type>ZGRID</type>
            <external_number>1234</external_number>
            <origin>
                <source>CRM</source>
                <key>128</key>
            </origin>
        </external_numbers>
    </record>
</entities>

XLST code:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:ns1="http://sap.com/xi/XI/SplitAndMerge" xmlns="http://schemas.ockhm.com/api/1/">
	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
	<xsl:template match="/">
		<xsl:element name="ns1:Messages">
			<xsl:element name="ns1:Message1">
				<xsl:element name="record">
					<xsl:for-each select="/record/member">
						<xsl:apply-templates/>
					</xsl:for-each>
				</xsl:element>
			</xsl:element>
		</xsl:element>
	</xsl:template>
</xsl:stylesheet>

Result coming :

<?xml version="1.0" encoding="UTF-8"?>
<ns1:Messages xmlns:ns1="http://sap.com/xi/XI/SplitAndMerge">
	<ns1:Message1>
		<record xmlns="http://schemas.ockhm.com/api/1/"/>
	</ns1:Message1>
</ns1:Messages>

Expected result:

<?xml version="1.0" encoding="UTF-8"?>
<ns1:Messages xmlns:ns1="http://sap.com/xi/XI/SplitAndMerge">
	<ns1:Message1>
		<record xmlns="http://schemas.ockhm.com/api/1/">
			<member>
				<source>L002</source>
				<key>0000969442</key>
			</member>
			<member>
				<source>L002</source>
				<key>0000280027</key>
			</member>
			<member>
				<source>L002</source>
				<key>0000910071</key>
			</member>
			<member>
				<source>L002</source>
				<key>0000770930</key>
			</member>
			<member>
				<source>L002</source>
				<key>0000770764</key>
			</member>
			<member>
				<source>SAP-CRM</source>
				<key>3000828451</key>
			</member>
			<member>
				<source>SAP-CRM</source>
				<key>3000006128</key>
			</member>
			<member>
				<source>SAP-CRM</source>
				<key>3001239775</key>
			</member>
			<member>
				<source>L002</source>
				<key>0000967132</key>
			</member>
			<member>
				<source>SAP-CRM</source>
				<key>3001836593</key>
			</member>
			<member>
				<source>SAP-CRM</source>
				<key>3001365029</key>
			</member>
		</record>
	</ns1:Message1>
</ns1:Messages>

Can anyone please let me know where is the mistake happened.


Solution

  • Before delving into XSLT I would suggest to take an XPath tutorial, if you have an input document where the root element is named entities then a path beginning with /record will never select anything as it looks for a root element named record.

    Depending on your XSLT version you also need to take the default namespace xmlns="http://schemas.ockhm.com/api/1/" in the XML into account, if you really have an XSLT 2 processor the easiest is to declare xpath-default-namespace="http://schemas.ockhm.com/api/1/" on your stylesheet's root element.

    That way a path like //record will select any record elements in that namespace.