Discussions
Categories
- 197K All Categories
- 2.5K Data
- 546 Big Data Appliance
- 1.9K Data Science
- 450.8K Databases
- 221.9K General Database Discussions
- 3.8K Java and JavaScript in the Database
- 31 Multilingual Engine
- 552 MySQL Community Space
- 479 NoSQL Database
- 7.9K Oracle Database Express Edition (XE)
- 3.1K ORDS, SODA & JSON in the Database
- 556 SQLcl
- 4K SQL Developer Data Modeler
- 187.2K SQL & PL/SQL
- 21.4K SQL Developer
- 296.3K Development
- 17 Developer Projects
- 139 Programming Languages
- 293K Development Tools
- 110 DevOps
- 3.1K QA/Testing
- 646.1K Java
- 28 Java Learning Subscription
- 37K Database Connectivity
- 158 Java Community Process
- 105 Java 25
- 22.1K Java APIs
- 138.2K Java Development Tools
- 165.3K Java EE (Java Enterprise Edition)
- 19 Java Essentials
- 162 Java 8 Questions
- 86K Java Programming
- 81 Java Puzzle Ball
- 65.1K New To Java
- 1.7K Training / Learning / Certification
- 13.8K Java HotSpot Virtual Machine
- 94.3K Java SE
- 13.8K Java Security
- 205 Java User Groups
- 24 JavaScript - Nashorn
- Programs
- 468 LiveLabs
- 39 Workshops
- 10.2K Software
- 6.7K Berkeley DB Family
- 3.5K JHeadstart
- 5.7K Other Languages
- 2.3K Chinese
- 175 Deutsche Oracle Community
- 1.1K Español
- 1.9K Japanese
- 233 Portuguese
need help with xml format

Database : 11.2.0.4
Windows 2016
I am trying to achieve the below format
<cac:Item>
<cbc:Name>RENT </cbc:Name>
<cac:ClassifiedTaxCategory>
<VLID_VAT_TYPE>E</VLID_VAT_TYPE>
<VLID_VAT_PERCENT>0</VLID_VAT_PERCENT>
</cac:ClassifiedTaxCategory>
<cbc:Name>FURNITURE/APPLIANCES RENT </cbc:Name>
<cac:ClassifiedTaxCategory>
<VLID_VAT_TYPE>S</VLID_VAT_TYPE>
<VLID_VAT_PERCENT>5</VLID_VAT_PERCENT>
</cac:ClassifiedTaxCategory>
<cbc:Name>MANAGEMENT FEES </cbc:Name>
<cac:ClassifiedTaxCategory>
<VLID_VAT_TYPE>S</VLID_VAT_TYPE>
<VLID_VAT_PERCENT>5</VLID_VAT_PERCENT>
</cac:ClassifiedTaxCategory>
</cac:Item>
I have used below query trying to acheive the desired output. Please correct me where am i wrong.
select XMLELEMENT("cac:Item", XMLAGG (XMLELEMENT("cbc:Name",d.VLID_DESCRIPTION,
XMLELEMENT("cac:ClassifiedTaxCategory",
XMLFOREST(d.VLID_VAT_TYPE as "cbc:ID",d.VLID_VAT_PERCENT as "cbc:percent"
XMLELEMENT("cac:TaxScheme",
XMLFOREST(d.TaxScheme as "cbc:ID"
)))))))as "ZATCA" FROM zatca d where invoice_number='2018/06/25/557557';
Best Answer
-
You didn't provide data sample, so I used SCOTT.EMP table but left your tag names and namespace names. I also used XMLSERIALIZE for display purpose:
SELECT XMLSERIALIZE( DOCUMENT XMLELEMENT( "cac:Item", XMLATTRIBUTES( 'https://xxx' as "xmlns:cbc", 'https://yyy' as "xmlns:cac" ), XMLELEMENT( "cbc:Name", JOB ), XMLELEMENT( "cac:ClassifiedTaxCategory", XMLAGG( XMLFOREST( ENAME "VLID_VAT_TYPE", SAL "VLID_VAT_PERCENT" ) ) ) ) INDENT SIZE=2 ) FROM EMP GROUP BY JOB / XMLSERIALIZE(DOCUMENTXMLELEMENT("CAC:ITEM",XMLATTRIBUTES('HTTPS://XXX'AS"XMLNS:C -------------------------------------------------------------------------------- <cac:Item xmlns:cbc="https://xxx" xmlns:cac="https://yyy"> <cbc:Name>ANALYST</cbc:Name> <cac:ClassifiedTaxCategory> <VLID_VAT_TYPE>SCOTT</VLID_VAT_TYPE> <VLID_VAT_PERCENT>3000</VLID_VAT_PERCENT> <VLID_VAT_TYPE>FORD</VLID_VAT_TYPE> <VLID_VAT_PERCENT>3000</VLID_VAT_PERCENT> </cac:ClassifiedTaxCategory> </cac:Item> <cac:Item xmlns:cbc="https://xxx" xmlns:cac="https://yyy"> <cbc:Name>CLERK</cbc:Name> <cac:ClassifiedTaxCategory> <VLID_VAT_TYPE>SMITH</VLID_VAT_TYPE> <VLID_VAT_PERCENT>800</VLID_VAT_PERCENT> <VLID_VAT_TYPE>MILLER</VLID_VAT_TYPE> <VLID_VAT_PERCENT>1300</VLID_VAT_PERCENT> <VLID_VAT_TYPE>JAMES</VLID_VAT_TYPE> <VLID_VAT_PERCENT>950</VLID_VAT_PERCENT> <VLID_VAT_TYPE>ADAMS</VLID_VAT_TYPE> <VLID_VAT_PERCENT>1100</VLID_VAT_PERCENT> </cac:ClassifiedTaxCategory> </cac:Item> <cac:Item xmlns:cbc="https://xxx" xmlns:cac="https://yyy"> <cbc:Name>MANAGER</cbc:Name> <cac:ClassifiedTaxCategory> <VLID_VAT_TYPE>JONES</VLID_VAT_TYPE> <VLID_VAT_PERCENT>2975</VLID_VAT_PERCENT> <VLID_VAT_TYPE>CLARK</VLID_VAT_TYPE> <VLID_VAT_PERCENT>2450</VLID_VAT_PERCENT> <VLID_VAT_TYPE>BLAKE</VLID_VAT_TYPE> <VLID_VAT_PERCENT>2850</VLID_VAT_PERCENT> </cac:ClassifiedTaxCategory> </cac:Item> <cac:Item xmlns:cbc="https://xxx" xmlns:cac="https://yyy"> <cbc:Name>PRESIDENT</cbc:Name> <cac:ClassifiedTaxCategory> <VLID_VAT_TYPE>KING</VLID_VAT_TYPE> <VLID_VAT_PERCENT>5000</VLID_VAT_PERCENT> </cac:ClassifiedTaxCategory> </cac:Item> <cac:Item xmlns:cbc="https://xxx" xmlns:cac="https://yyy"> <cbc:Name>SALESMAN</cbc:Name> <cac:ClassifiedTaxCategory> <VLID_VAT_TYPE>ALLEN</VLID_VAT_TYPE> <VLID_VAT_PERCENT>1600</VLID_VAT_PERCENT> <VLID_VAT_TYPE>TURNER</VLID_VAT_TYPE> <VLID_VAT_PERCENT>1500</VLID_VAT_PERCENT> <VLID_VAT_TYPE>MARTIN</VLID_VAT_TYPE> <VLID_VAT_PERCENT>1250</VLID_VAT_PERCENT> <VLID_VAT_TYPE>WARD</VLID_VAT_TYPE> <VLID_VAT_PERCENT>1250</VLID_VAT_PERCENT> </cac:ClassifiedTaxCategory> </cac:Item> SQL>
SY.
Answers
-
You didn't provide data sample, so I used SCOTT.EMP table but left your tag names and namespace names. I also used XMLSERIALIZE for display purpose:
SELECT XMLSERIALIZE( DOCUMENT XMLELEMENT( "cac:Item", XMLATTRIBUTES( 'https://xxx' as "xmlns:cbc", 'https://yyy' as "xmlns:cac" ), XMLELEMENT( "cbc:Name", JOB ), XMLELEMENT( "cac:ClassifiedTaxCategory", XMLAGG( XMLFOREST( ENAME "VLID_VAT_TYPE", SAL "VLID_VAT_PERCENT" ) ) ) ) INDENT SIZE=2 ) FROM EMP GROUP BY JOB / XMLSERIALIZE(DOCUMENTXMLELEMENT("CAC:ITEM",XMLATTRIBUTES('HTTPS://XXX'AS"XMLNS:C -------------------------------------------------------------------------------- <cac:Item xmlns:cbc="https://xxx" xmlns:cac="https://yyy"> <cbc:Name>ANALYST</cbc:Name> <cac:ClassifiedTaxCategory> <VLID_VAT_TYPE>SCOTT</VLID_VAT_TYPE> <VLID_VAT_PERCENT>3000</VLID_VAT_PERCENT> <VLID_VAT_TYPE>FORD</VLID_VAT_TYPE> <VLID_VAT_PERCENT>3000</VLID_VAT_PERCENT> </cac:ClassifiedTaxCategory> </cac:Item> <cac:Item xmlns:cbc="https://xxx" xmlns:cac="https://yyy"> <cbc:Name>CLERK</cbc:Name> <cac:ClassifiedTaxCategory> <VLID_VAT_TYPE>SMITH</VLID_VAT_TYPE> <VLID_VAT_PERCENT>800</VLID_VAT_PERCENT> <VLID_VAT_TYPE>MILLER</VLID_VAT_TYPE> <VLID_VAT_PERCENT>1300</VLID_VAT_PERCENT> <VLID_VAT_TYPE>JAMES</VLID_VAT_TYPE> <VLID_VAT_PERCENT>950</VLID_VAT_PERCENT> <VLID_VAT_TYPE>ADAMS</VLID_VAT_TYPE> <VLID_VAT_PERCENT>1100</VLID_VAT_PERCENT> </cac:ClassifiedTaxCategory> </cac:Item> <cac:Item xmlns:cbc="https://xxx" xmlns:cac="https://yyy"> <cbc:Name>MANAGER</cbc:Name> <cac:ClassifiedTaxCategory> <VLID_VAT_TYPE>JONES</VLID_VAT_TYPE> <VLID_VAT_PERCENT>2975</VLID_VAT_PERCENT> <VLID_VAT_TYPE>CLARK</VLID_VAT_TYPE> <VLID_VAT_PERCENT>2450</VLID_VAT_PERCENT> <VLID_VAT_TYPE>BLAKE</VLID_VAT_TYPE> <VLID_VAT_PERCENT>2850</VLID_VAT_PERCENT> </cac:ClassifiedTaxCategory> </cac:Item> <cac:Item xmlns:cbc="https://xxx" xmlns:cac="https://yyy"> <cbc:Name>PRESIDENT</cbc:Name> <cac:ClassifiedTaxCategory> <VLID_VAT_TYPE>KING</VLID_VAT_TYPE> <VLID_VAT_PERCENT>5000</VLID_VAT_PERCENT> </cac:ClassifiedTaxCategory> </cac:Item> <cac:Item xmlns:cbc="https://xxx" xmlns:cac="https://yyy"> <cbc:Name>SALESMAN</cbc:Name> <cac:ClassifiedTaxCategory> <VLID_VAT_TYPE>ALLEN</VLID_VAT_TYPE> <VLID_VAT_PERCENT>1600</VLID_VAT_PERCENT> <VLID_VAT_TYPE>TURNER</VLID_VAT_TYPE> <VLID_VAT_PERCENT>1500</VLID_VAT_PERCENT> <VLID_VAT_TYPE>MARTIN</VLID_VAT_TYPE> <VLID_VAT_PERCENT>1250</VLID_VAT_PERCENT> <VLID_VAT_TYPE>WARD</VLID_VAT_TYPE> <VLID_VAT_PERCENT>1250</VLID_VAT_PERCENT> </cac:ClassifiedTaxCategory> </cac:Item> SQL>
SY.
-
Does this create your required output:
with zatca (invoice_number, vlid_description, vlid_vat_type, vlid_vat_percent, TaxScheme ) as (select '2018/06/25/557557', 'RENT', 'E', 0, 'TS0' from DUAL union all select '2018/06/25/557557','FURNITURE/APPLIANCES RENT','S',5,'TS1' from DUAL union all select '2018/06/25/557557', 'MANAGEMENT FEES', 'S', 5, 'TS2' from DUAL) select xmlelement ( "cac:Item", xmlattributes('cac URN' as "xmlns:cac",'cbc URN' as "xmlns:cbc"), xmlagg ( xmlelement ( "cbc:Name", d.VLID_DESCRIPTION, xmlelement ( "cac:ClassifiedTaxCategory", xmlforest (d.VLID_VAT_TYPE as "cbc:ID", d.VLID_VAT_PERCENT as "cbc:percent" ), xmlelement("cac:TaxScheme", xmlforest(d.TaxScheme as "cbc:ID") ) ) ) ) ) as "ZATCA" FROM zatca d WHERE invoice_number = '2018/06/25/557557'; Output: <cac:Item xmlns:cac="cac URN" xmlns:cbc="cbc URN"> <cbc:Name>RENT<cac:ClassifiedTaxCategory> <cbc:ID>E</cbc:ID> <cbc:percent>0</cbc:percent> <cac:TaxScheme> <cbc:ID>TS0</cbc:ID> </cac:TaxScheme> </cac:ClassifiedTaxCategory> </cbc:Name> <cbc:Name>FURNITURE/APPLIANCES RENT<cac:ClassifiedTaxCategory> <cbc:ID>S</cbc:ID> <cbc:percent>5</cbc:percent> <cac:TaxScheme> <cbc:ID>TS1</cbc:ID> </cac:TaxScheme> </cac:ClassifiedTaxCategory> </cbc:Name> <cbc:Name>MANAGEMENT FEES<cac:ClassifiedTaxCategory> <cbc:ID>S</cbc:ID> <cbc:percent>5</cbc:percent> <cac:TaxScheme> <cbc:ID>TS2</cbc:ID> </cac:TaxScheme> </cac:ClassifiedTaxCategory> </cbc:Name> </cac:Item>