<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>JDeveloper on DecipherMiddleware</title><link>https://blog.deciphermiddleware.in/tags/jdeveloper/</link><description>Recent content in JDeveloper on DecipherMiddleware</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sat, 12 Mar 2022 07:45:00 +0000</lastBuildDate><atom:link href="https://blog.deciphermiddleware.in/tags/jdeveloper/index.xml" rel="self" type="application/rss+xml"/><item><title>DECIPHER: Dynamic XSLTs in BPEL (SOA 12c)</title><link>https://blog.deciphermiddleware.in/posts/decipher-dynamic-xslts-in-bpel-soa-12c/</link><pubDate>Sat, 12 Mar 2022 07:45:00 +0000</pubDate><guid>https://blog.deciphermiddleware.in/posts/decipher-dynamic-xslts-in-bpel-soa-12c/</guid><description>&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/3b0f0ad9f3.jpg"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/3b0f0ad9f3.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;While developing integrations in BPEL 12c, XSLT is most commonly used to transform different XML message structures. We generally come across scenarios wherein based on specific input fields, our transformation logic changes. What we generally do is have all conditions within the same XSLT file. This makes our XSLT look a lot bigger and difficult to maintain. A better way would be to have different XSLTs and move deciding factor out of XSLT. Once we create different XSLTs for specific use cases having the same output format, now the question will come how to configure these XSLTs to be picked at runtime? This blog is curated with answers to such and many more questions.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s take the example of account creation. There is a source application sending account information in an XML document which we need to update in a backend database. Now source system can send different types of address information like home address, business address, or shipping address. We get this information in the &lt;strong&gt;addressType&lt;/strong&gt; input field. In the backend database, for each type of address, there are different fields in the backend database. There could various ways to handle this.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create one single XSLT to handle all the scenarios using XSLT functions like &lt;strong&gt;if, choose-when&lt;/strong&gt; , etc. One single XSLT file for all the scenarios, BPEL code will be easy to read. But this will lead to a huge XSLT file and will be a bit tricky to maintain. In the future, if we want to add new conditions for only secondary addresses, then regression testing might be required to ensure we don&amp;rsquo;t hamper the other functionality.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/d4f912cbdf.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/d4f912cbdf.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Another way could be to have separate XSLTs for each scenario. As per the example, we have 3 scenarios. The address can be of type home, business, or shipping address.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We can have 3 XSLTs created for each scenario. Now maintainability of Transformation XSLT code will be a lot easier. These can now be configured using an if-else block within the BPEL process to decide which XSLT to pick. The BPEL process will look now similar to below.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/ea2ad1b12b.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/ea2ad1b12b.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;Now suppose tomorrow we have a new condition added, then we need to add another block of &amp;ldquo;elseif&amp;rdquo; to accommodate this. This will make your BPEL code look bigger.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In SOA 12c we have below two functions that can be used to shorten the BPEL flow and use the XSLT dynamically.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ora:processXSLT&lt;/li&gt;
&lt;li&gt;ora:doXSLTransformForDoc&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;xmlns:ora&lt;/strong&gt; =&amp;ldquo;&lt;a href="http://schemas.oracle.com/xpath/extension%22"&gt;http://schemas.oracle.com/xpath/extension&amp;quot;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Both of the above functions support the location of the XSLT file and input XML. The above functions can be used in conjunction with DVM to fetch the location of XSLT and assign it to the input of the function.&lt;br&gt;
For the same example, let&amp;rsquo;s consider below DVM file as an example.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/8b70819393.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/8b70819393.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We can use the above DVM file to extract the location of XSLT that can be used. Suppose we store the conditional value in a variable called &lt;strong&gt;$addType&lt;/strong&gt;(having one of the values in the home, business, or shipping). We can use DVM lookup to fetch the resulting XSLT file location that can be provided as input to the above-mentioned functions in an Assign activity. In case none of the conditions matches the default.xsl file can be used.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;dvm:lookupValue&lt;/strong&gt;(&amp;ldquo;dvms/dynamicXSLT.dvm&amp;rdquo;, &amp;ldquo;addressType&amp;rdquo;,$addType, &amp;ldquo;xsltLocation&amp;rdquo;, &amp;ldquo;transformations/default.xsl&amp;rdquo;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Let us assume the output value of the above expression is stored in variable $dynamicXSLT and input XML is stored in $input. The expression will be:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ora:processXSLT&lt;/strong&gt;($dynamicXSLT, $input)&lt;br&gt;
&lt;strong&gt;ora:doXSLTransformForDoc&lt;/strong&gt;($dynamicXSLT, $input)&lt;/p&gt;
&lt;p&gt;Both the above functions do a similar task. But there is one major difference. Suppose your XSLT requires extra complex parameters to be passed as input. In such scenarios &lt;strong&gt;ora:doXSLTransformForDoc&lt;/strong&gt; comes real handy. In this function, we can pass key-value pairs of parameters that can be used within the XSLT.&lt;/p&gt;
&lt;p&gt;For example, if our XSLT requires a parameter &lt;strong&gt;contact&lt;/strong&gt;(as defined in XSLT) and the value is stored in the &lt;strong&gt;$Contact&lt;/strong&gt; variable in the BPEL process. Now our function will look like.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ora:doXSLTransformForDoc&lt;/strong&gt;($dynamicXSLT, $input, &amp;lsquo;contact&amp;rsquo;, $contact)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="references"&gt;References: &lt;a href="#references" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href="https://docs.oracle.com/middleware/12211/soasuite/develop/GUID-B37B91AF-0036-47EC-AB9F-FCBCD2BA55E2.htm#SOASE2117"&gt;https://docs.oracle.com/middleware/12211/soasuite/develop/GUID-B37B91AF-0036-47EC-AB9F-FCBCD2BA55E2.htm#SOASE2117&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Please share your valuable feedback 😊😊😊&lt;/p&gt;</description></item><item><title>Demystifying file read as attachment in SOA 12c</title><link>https://blog.deciphermiddleware.in/posts/demystifying-file-read-as-attachment-in/</link><pubDate>Sat, 27 Nov 2021 21:12:00 +0000</pubDate><guid>https://blog.deciphermiddleware.in/posts/demystifying-file-read-as-attachment-in/</guid><description>&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/e86152fc43.jpg"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/e86152fc43.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In cases when we just want to move a file(without transformation) from one SFTP/FTP/file location to the other SFTP/FTP/file location, we can read a file with or without schema and then perform the write operation to the target location. If we provide an exact file schema for conversion to XML, it takes a lot of heap memory to transform from a csv or ffd to an XML document. In cases when files are not simple text files or schema is not available, one way to do so is to read the file as an opaque object and write it to a target location. In doing so, we still use a heap memory of the WebLogic server. If we are dealing with very large files, this may impact server performance as the conversion to opaque elements will take place behind the scenes. Using opaque schema is never recommended to process huge files. One better way of handling such a scenario is to read a file as an attachment in SOA 12c. Generally, we have below question:&lt;/p&gt;
&lt;h2 id="what-is-reading-a-file-as-an-attachment-means"&gt;What is reading a file as an attachment means? &lt;a href="#what-is-reading-a-file-as-an-attachment-means" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;In this case, we are not loading the contents of the file in the memory of the Weblogic server i.e in BPEL flow we will not see the contents of the file loaded instead, a href to the actual file is seen. In this case, the Weblogic server leverages SOA-INFRA tables to load file data in the table and in return gives href to the flow. This href actually links to data stored in the SOA-INFRA table and can be used to write files to the different locations (in the same or different FTP servers).&lt;/p&gt;
&lt;p&gt;To understand better, let&amp;rsquo;s take an example of flow which polls the FTP directory every 10 minutes and read as an attachment. Then, how we can find the payload from SOA-INFRA tables.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/379a3dd04f.jpg"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/379a3dd04f.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Below are the steps to configure the file/FTP adapter in BPEL(SOA 12c).&lt;/p&gt;
&lt;h2 id="configuration-steps"&gt;Configuration Steps: &lt;a href="#configuration-steps" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;1. Create a SOA project in Jdevloper 12c.&lt;/p&gt;
&lt;p&gt;2. Drag and drop FTP adapter from component pallet. Enter the &lt;strong&gt;service name&lt;/strong&gt;. Click Next.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/575729400a.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/575729400a.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;3. Select &lt;strong&gt;Define from operation and schema (specified later)&lt;/strong&gt;. Click Next.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/659e3685a0.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/659e3685a0.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;4. Specify the source &lt;strong&gt;FTP JNDI&lt;/strong&gt; name as configured in the Weblogic server. Click next.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/b95a9cf0c4.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/b95a9cf0c4.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;5. Select operation type as &lt;strong&gt;Get File&lt;/strong&gt;. Check the &lt;strong&gt;Read File As Attachment&lt;/strong&gt;. If we know the character set, encoding, and Content-Type of the file, then specify else leave it blank. Click Next.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/45c7f14392.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/45c7f14392.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;6. Specify the input directory from where we want to pick the file from. Check &lt;strong&gt;Archive processed files&lt;/strong&gt; , and specify a directory for archive files if we want to archive the data after processing. Check &lt;strong&gt;Delete files after successful retrieval&lt;/strong&gt; if we want to delete the file after processing. Click Next.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/8ad73896ee.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/8ad73896ee.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;7. Provide the file name pattern or regex file name pattern and click Next.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/fd20684f1c.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/fd20684f1c.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;8. Specify the polling frequency and click Next. Click on Finish to complete the adapter configuration.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/421396f1b2.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/421396f1b2.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;9. Add a BPEL component with no service, i.e. define service later.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/52cd824c48.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/52cd824c48.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;10. Join the wire from the FTP adapter to the BPEL component.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/8bf3d1fb80.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/8bf3d1fb80.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;11. Open the BPEL component, and configure receive activity as shown below.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/73c397a022.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/73c397a022.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;12. Click OK. Save and deploy the code on the Weblogic server.&lt;/p&gt;
&lt;h2 id="analyzing-the-read-file-as-an-attachment"&gt;Analyzing the read file as an attachment &lt;a href="#analyzing-the-read-file-as-an-attachment" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s test the service and see the behaviour of file being read as an attachment.&lt;/p&gt;
&lt;p&gt;1. Place the file in the FTP location and wait for it to get it picked.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/dbb3b822c3.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/dbb3b822c3.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2. Once the file is picked, log in to the em console. We will see an instance created.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/e7c151f581.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/e7c151f581.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;3. Open the flow, here we will see only the href.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/b3ee06ca0a.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/b3ee06ca0a.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now after seeing this, we might think about where did our data go. As we see only href. But where is our actual data?&lt;/p&gt;
&lt;p&gt;Our data is safe within soa-infra database.&lt;/p&gt;
&lt;p&gt;4. To query the file data and file attributes, connect to the SOA-INFRA database of the SOA instance.&lt;/p&gt;
&lt;p&gt;5. Run the below query&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;attachment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;where&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dbkey&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;href-value&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/937c749fe8.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/937c749fe8.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;File data is stored in blob format within the &lt;strong&gt;attachment&lt;/strong&gt; table.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="references"&gt;References: &lt;a href="#references" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href="https://docs.oracle.com/middleware/1213/adapters/develop-soa-adapters/GUID-088EFFE9-AE8B-4A35-B9DB-0A0DDA1BBBE7.htm#TKADP590"&gt;https://docs.oracle.com/middleware/1213/adapters/develop-soa-adapters/GUID-088EFFE9-AE8B-4A35-B9DB-0A0DDA1BBBE7.htm#TKADP590&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please share your valuable feedback 😊😊😊&lt;/p&gt;</description></item><item><title>[OSB 12c][Tutorial] OSB 12c SOAP webservice for temperature conversion i.e. Celsius to Fahrenheit and vice versa</title><link>https://blog.deciphermiddleware.in/posts/osb-12ctutorial-osb-12c-soap-webservice/</link><pubDate>Thu, 08 Apr 2021 19:22:00 +0000</pubDate><guid>https://blog.deciphermiddleware.in/posts/osb-12ctutorial-osb-12c-soap-webservice/</guid><description>&lt;p&gt;This tutorial is intended for the audience who are completely new to OSB and want to try a simple hello world kind of application. Instead of sending and receiving &lt;strong&gt;Hello World!&lt;/strong&gt;. We will be using simple temperature conversion i.e. from Celsius to Fahrenheit and vice versa. We will be using simple Xquery to do all conversion and logic.&lt;/p&gt;
&lt;h3 id="high-level"&gt;High Level: &lt;a href="#high-level" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/da676403c2.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/da676403c2.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In this case, our OSB component will contain 2 parts proxy service and pipeline. Proxy service will expose SOAP endpoint to the client application and pipeline will perform various operations on input payload. Since this is just a Hello World application, we will not be using business services. XQuery will be used to implement mathematical logic and conditional logic. Service will take temperature as input and will perform either Fahrenheit to Celsius (FtoC) or Celsius to Fahrenheit (CtoF) temperature conversion. If the conversion type is invalid, then the service will return a failure status.&lt;/p&gt;
&lt;h3 id="mathematical-calculations"&gt;Mathematical Calculations: &lt;a href="#mathematical-calculations" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Let temperature in Fahrenheit be X℉ and temperature in Celsius be Y℃.&lt;/p&gt;
&lt;p&gt;Fahrenheit to Celsius (FtoC)&lt;/p&gt;
&lt;p&gt;X = (9/5*Y) + 32&lt;/p&gt;
&lt;p&gt;Celsius to Fahrenheit (CtoF)&lt;/p&gt;
&lt;p&gt;Y = (X-32)*5/9&lt;/p&gt;
&lt;h3 id="steps"&gt;Steps: &lt;a href="#steps" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;em&gt;Note: Jdeveloper 12c(12.2.1.4) is used for creating OSB artifacts.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;1. Click on File. Click on &lt;strong&gt;New&lt;/strong&gt; and then on &lt;strong&gt;Application&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/b808f86f72.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/b808f86f72.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2. Click on &lt;strong&gt;Service Bus Application with Service Bus Project&lt;/strong&gt;. Click on &lt;strong&gt;OK&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/dfd9026d9d.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/dfd9026d9d.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;3. Specify the &lt;strong&gt;Application Name&lt;/strong&gt; and click on &lt;strong&gt;Next&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/f3a9c6c5e2.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/f3a9c6c5e2.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;4. Specify the &lt;strong&gt;Project Name&lt;/strong&gt; and click on &lt;strong&gt;Finish&lt;/strong&gt;. Service Bus Application and Project will be created.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/23f9b29ad3.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/23f9b29ad3.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/23f9b29ad3.png"&gt;&lt;/a&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/d24a5916f8.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/d24a5916f8.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;5. Right-click on the project, click on New and then Click on &lt;strong&gt;XML Schema&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/b0fa135a2c.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/b0fa135a2c.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;6. Specify the File Name, Directory, and Target Namespace for the XML schema. Click on OK. A new schema file will be created.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/fb19f53dd6.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/fb19f53dd6.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;7. Replace content in the file with the below schema data.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xsd" data-lang="xsd"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;windows-1252&amp;#34; ?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;xsd:schema&lt;/span&gt; &lt;span class="na"&gt;xmlns:xsd=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://www.w3.org/2001/XMLSchema&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://www.example.org&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;targetNamespace=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://www.example.org&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;elementFormDefault=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;qualified&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Request&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;xsd:complexType&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;xsd:sequence&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;temperature&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;xsd:double&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;unit&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;xsd:string&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;conversionType&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;xsd:string&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/xsd:sequence&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/xsd:complexType&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/xsd:element&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Response&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;xsd:complexType&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;xsd:sequence&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;status&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;xsd:string&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;statusDescription&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;xsd:string&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;temperature&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;xsd:double&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;unit&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;xsd:string&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/xsd:sequence&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/xsd:complexType&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/xsd:element&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/xsd:schema&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;8. Drag and drop &lt;strong&gt;pipeline&lt;/strong&gt; from the component palette to &lt;strong&gt;Pipelines/Split Joins area&lt;/strong&gt;. &amp;ldquo;&lt;strong&gt;Create Pipeline Service&lt;/strong&gt; &amp;quot; window will appear.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8Za-Pu4bPS5YFxC5ZZW9JXsFd54OivT-Qhxc1zyT449U-W2VaqYcbZgp6qAtTqjlPYUmiRhwmjcjRyBRTT3lpG2ICXgnhqVXcBJI5nGOglv-1oLFf1wUuhw9hXtI5IHlVg-sNR9AdJ10/"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/0ada9bf2b5.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;6. Specify the name for the pipeline and click on Next.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/af24aeb250.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/af24aeb250.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;9. Select the WSDL radio button and click on create WSDL button.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/16114c9a99.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/16114c9a99.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;10. Use the schema created in&lt;strong&gt;step 7&lt;/strong&gt; and create WSDL using Create WSDL dialog box. Click on OK.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/080224a66d.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/080224a66d.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;11. The details will be populated. Check the &lt;strong&gt;Expose as a Proxy Service&lt;/strong&gt;. Specify the name of the proxy service and set Proxy Transport as HTTP. Click on Finish.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/7101e55c06.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/7101e55c06.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;12. Double Click on the pipeline.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/c1344e75c8.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/c1344e75c8.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The pipeline window will open as below.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/4115ab11f3.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/4115ab11f3.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;13. Drag pipeline pair from component pallet and drop below the entry point of the pipeline.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/695ff531a5.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/695ff531a5.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pipeline pair will be added as below and 2 stages will be created, one each under request and response pipelines respectively.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/f3238663a3.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/f3238663a3.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;14. To implement transformation, we will be using XQuery. Create a new XQuery file with the name transformation_xquery.xqy under the Transformations folder.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-xquery" data-lang="xquery"&gt;xquery version &amp;#34;1.0&amp;#34; encoding &amp;#34;utf-8&amp;#34;;
(:: OracleAnnotationVersion &amp;#34;1.0&amp;#34; ::)
declare namespace ns1=&amp;#34;http://www.example.org&amp;#34;;
(:: import schema at &amp;#34;../temperature.xsd&amp;#34; ::)
declare variable $Request as element() (:: schema-element(ns1:Request) ::) external;
declare function local:func($Request as element() (:: schema-element(ns1:Request) ::)) as element() (:: schema-element(ns1:Response) ::) {
if($Request/ns1:conversionType =&amp;#39;CtoF&amp;#39;) then(
&amp;lt;ns1:Response&amp;gt;
&amp;lt;ns1:status&amp;gt;SUCCESS&amp;lt;/ns1:status&amp;gt;
&amp;lt;ns1:statusDescription&amp;gt;Converted to Fahrenheit unit!&amp;lt;/ns1:statusDescription&amp;gt;
&amp;lt;ns1:temperature&amp;gt;{(xs:double($Request/ns1:temperature) * 9.0 div 5.0)+32}&amp;lt;/ns1:temperature&amp;gt;
&amp;lt;ns1:unit&amp;gt;F&amp;lt;/ns1:unit&amp;gt;
&amp;lt;/ns1:Response&amp;gt;
)
else(
if($Request/ns1:conversionType =&amp;#39;FtoC&amp;#39;) then(
&amp;lt;ns1:Response&amp;gt;
&amp;lt;ns1:status&amp;gt;SUCCESS&amp;lt;/ns1:status&amp;gt;
&amp;lt;ns1:statusDescription&amp;gt;Converted to Celsius unit!&amp;lt;/ns1:statusDescription&amp;gt;
&amp;lt;ns1:temperature&amp;gt;{((xs:double($Request/ns1:temperature)-32)*5.0 div 9.0)}&amp;lt;/ns1:temperature&amp;gt;
&amp;lt;ns1:unit&amp;gt;C&amp;lt;/ns1:unit&amp;gt;
&amp;lt;/ns1:Response&amp;gt;
)
else(
&amp;lt;ns1:Response&amp;gt;
&amp;lt;ns1:status&amp;gt;FAILURE&amp;lt;/ns1:status&amp;gt;
&amp;lt;ns1:statusDescription&amp;gt;INVALID conversion type&amp;lt;/ns1:statusDescription&amp;gt;
&amp;lt;ns1:temperature&amp;gt;{$Request/ns1:temperature}&amp;lt;/ns1:temperature&amp;gt;
&amp;lt;ns1:unit&amp;gt;{$Request/ns1:unit}&amp;lt;/ns1:unit&amp;gt;
&amp;lt;/ns1:Response&amp;gt;
)
)
};
local:func($Request)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;15. Add Replace activity to response pipeline under Stage 1.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/06366c2a38.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/06366c2a38.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;16. Under replace properties, set location as the &lt;strong&gt;body&lt;/strong&gt;. Location expression as &amp;ldquo;.&amp;rdquo;. For value select &lt;strong&gt;XQuery resource&lt;/strong&gt;. A window will open. Update the values as shown below. Click on OK.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/bd9fa75a2d.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/bd9fa75a2d.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;17. Under &lt;strong&gt;Replace Option&lt;/strong&gt; , Select &amp;ldquo;&lt;strong&gt;Replace Node Contents&lt;/strong&gt; &amp;ldquo;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/92bb207e22.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/92bb207e22.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;18. Open the proxy service and specify the endpoint for the service or project.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/793782adac.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/793782adac.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Endpoint URI will be the relative URI and the hostname will be added before Endpoint URI for the final URL i.e.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;http://&amp;lt;hostname&amp;gt;:&amp;lt;port&amp;gt;/&amp;lt;Endpoint-URI&amp;gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;19. We need to deploy the service to SBConsole. We can either create a jar and deploy it to the service bus console else we can directly deploy it from Jdeveloper if a server is configured in Jdevloper.&lt;/p&gt;
&lt;p&gt;20. Login to the Service Bus console. Open the proxy service. Click on the Green button to launch the test console.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/9e40476c3e.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/9e40476c3e.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;21. Specify the values for the XML elements and Click on Execute.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/77539b18ee.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/77539b18ee.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The service performs the temperature conversion based on inputs and returns the results as below.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/21d9cae768.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/21d9cae768.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We can test and play with different sets of values to check if the code is working fine and even enhance it further.&lt;/p&gt;
&lt;p&gt;Please share your valuable feedback in the comments section below 😊&lt;/p&gt;</description></item><item><title>Create Delimited String from XML Nodes and Vice Versa in SOA 12c</title><link>https://blog.deciphermiddleware.in/posts/create-delimited-string-or-xml-nodes/</link><pubDate>Fri, 25 Dec 2020 00:00:00 +0000</pubDate><guid>https://blog.deciphermiddleware.in/posts/create-delimited-string-or-xml-nodes/</guid><description>&lt;p&gt;A delimited string is a string representation of data separated by a delimiter(e.g. &amp;ldquo;,&amp;rdquo;). A simple representation of the delimited string will look like.&lt;/p&gt;
&lt;h2 id="delimited-string-examples"&gt;Delimited String Examples &lt;a href="#delimited-string-examples" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;Sample-1-- Delimiter as &amp;#34;,&amp;#34;
Value1,Value2,Value3
Sample-2-- Delimiter as &amp;#34;|&amp;#34;
Value1|Value2|Value3
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If we want to represent the above set of delimited values in the form of an XML document under some root and parent tag. The representation will look like this.&lt;/p&gt;
&lt;h3 id="xml-example"&gt;XML Example &lt;a href="#xml-example" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;root&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://test.com/sample/xml&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;Values&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;Value1&lt;span class="nt"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;Value2&lt;span class="nt"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;Value3&lt;span class="nt"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/Values&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/root&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sometimes we may need to convert values coming in delimited string to an xml document or vice versa. Since delimited string is similar to csv format. We can create a nxsd schema and then perform translate i.e. native to xml or xml to native within our SOA application. But in the scenarios wherein we just want to convert one delimited string to xml or recurring xml nodes to one delimited string, there we can make use of oracle xpath extension functions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.deciphermiddleware.in/2020/12/create-delimited-string-or-xml-nodes.html#1"&gt;oraext:create-nodeset-from-delimited-string()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.deciphermiddleware.in/2020/12/create-delimited-string-or-xml-nodes.html#2"&gt;oraext:create-delimited-string()&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;xmlns:oraext=&amp;ldquo;&lt;a href="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.ExtFunc%22"&gt;http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.ExtFunc&amp;quot;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Both functions can be used in XSLT or BPEL assign activity. The above two mentioned examples will be used for explaining these 2 functions.&lt;/p&gt;
&lt;h2 id="oraextcreate-nodeset-from-delimited-string"&gt;oraext:create-nodeset-from-delimited-string() &lt;a href="#oraextcreate-nodeset-from-delimited-string" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This function is used to create XML node set from delimited string. Basic syntax of the function is as below.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;oraext:create-nodeset-from-delimited-string ($qName, $delimitedString, $delimiter)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;$qName:&lt;/strong&gt; Qualified name of the node for each value to be created along with namespace. For e.g. &amp;lsquo;{http://test.com/sample/xml}value&amp;rsquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;$delimitedString:&lt;/strong&gt; String containing values delimited by a delimiter. Examples as above.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;$delimiter:&lt;/strong&gt; String representation of delimiter. For e.g. &amp;lsquo;,&amp;rsquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="sample-xslt-code"&gt;Sample XSLT code: &lt;a href="#sample-xslt-code" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xslt" data-lang="xslt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;xsl:template&lt;/span&gt; &lt;span class="na"&gt;match&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ns1:root&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ns1:Values&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;xsl:copy-of&lt;/span&gt; &lt;span class="na"&gt;select&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;oraext:create-nodeset-from-delimited-string(&amp;#39;{http://test.com/sample/xml}value&amp;#39;,&amp;#39;Value1,Value2,Value3&amp;#39; , &amp;#39;,&amp;#39; )&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ns1:Values&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ns1:root&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;xsl:template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Excluding, the XSL header for a better view. Please make sure all namespaces are properly imported in the XSL header.
The above code snippet will give output as above example.&lt;/p&gt;
&lt;h2 id="oraextcreate-delimited-string"&gt;oraext:create-delimited-string() &lt;a href="#oraextcreate-delimited-string" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This function is used to convert nodes to delimited string. Below is the syntax of the function.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;oraext:create-delimited-string ($nodeSetValue, $delimiter)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;$nodeSetValue:&lt;/strong&gt; repetitive nodes or combination of nodes for which delimited string needs to be created. For e.g.&lt;/p&gt;
&lt;h3 id="xml-sample"&gt;XML Sample &lt;a href="#xml-sample" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;Value1&lt;span class="nt"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;Value2&lt;span class="nt"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;Value3&lt;span class="nt"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;$delimiter:&lt;/strong&gt; String representation of delimiter. For e.g. &amp;lsquo;,&amp;rsquo;&lt;/p&gt;
&lt;p&gt;Sample code using the above sample&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xsl" data-lang="xsl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--&amp;#39;,&amp;#39; as delimiter--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;xsl:value-of&lt;/span&gt; &lt;span class="na"&gt;select=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;oraext:create-delimited-string ($nodeSet/ns1:Values/ns1:value, &amp;#39;,&amp;#39;)&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--&amp;#39;|&amp;#39; as delimiter--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;xsl:value-of&lt;/span&gt; &lt;span class="na"&gt;select=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;oraext:create-delimited-string ($nodeSet/ns1:Values/ns1:value, &amp;#39;|&amp;#39;)&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;xmlns:ns1=&amp;ldquo;&lt;a href="http://test.com/sample/xml%22"&gt;http://test.com/sample/xml&amp;quot;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here &lt;strong&gt;$nodeSet&lt;/strong&gt; contains the XML data as represented in above example. Above XSL snippets will yield results as shown in &lt;a href="#delimited-string-examples"&gt;delimited string samples&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Import and Export MDS artifacts in SOA 12c</title><link>https://blog.deciphermiddleware.in/posts/import-and-export-mds-artifacts-in-soa/</link><pubDate>Tue, 22 Dec 2020 13:51:00 +0000</pubDate><guid>https://blog.deciphermiddleware.in/posts/import-and-export-mds-artifacts-in-soa/</guid><description>&lt;p&gt;Oracle SOA-MDS (Metadata Store) repository can be used to access artifacts that can be shared among various SOA composites. For example, we have one common schema for a business fault that is consumed by various applications. Instead of having a localized copy of that schema file in each SOA composite, we can have it in a centralized repository (SOA-MDS). Another benefit of using SOA-MDS is that we can change the file at runtime and need not redeploy the complete code.&lt;/p&gt;
&lt;p&gt;While developing SOA composites, we use SOA design-time repository, later these changes can be synced to the SOA servers. In this article, we will discuss 2 ways to sync the artifacts available in the SOA design-time repository and the SOA servers.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="#1-establishing-the-connection-to-soa-mds-in-jdeveloper"&gt;Establishing the connection to SOA-MDS in Jdeveloper.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#2-using-soa-em-console-or-fusion-middleware-control-console"&gt;Using SOA em console or Fusion Middleware control console.&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="moving-a-file-between-soa-composite-to-soa-design-time-mds-repository"&gt;Moving a file between SOA composite to SOA design-time MDS repository &lt;a href="#moving-a-file-between-soa-composite-to-soa-design-time-mds-repository" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s assume, we created a &lt;strong&gt;businessFault.xsd&lt;/strong&gt; which will be used by various SOA composites or projects.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/6dcc9a6563.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/6dcc9a6563.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Before moving this file to the SOA server MDS location, we need to first push it to the SOA design-time repository.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To do so, right-click on &lt;strong&gt;businessFault.xsd&lt;/strong&gt; and click on &lt;strong&gt;Share using SOA Design-Time MDS Repository&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/4f0bafb1e3.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/4f0bafb1e3.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make sure, that file is not opened in Jdeveloper else you will get the below error.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/5c97fbd7f6.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/5c97fbd7f6.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A wizard will open as below. Click next to proceed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/1f0d7d52d5.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/1f0d7d52d5.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Select the folder in which you want to place the file. For e.g. &amp;lsquo;/apps/Common&amp;rsquo;. Click Next.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/98dde21089.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/98dde21089.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If the document exists with the same name and we want to overwrite, then check the &lt;strong&gt;Overwrite if document exists in the target MDS repository&lt;/strong&gt;. Click Next&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/722acc7277.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/722acc7277.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If there are any references for the document, then those will be displayed along with updates that will happen. In this scenario, the file is not being used currently and the list is empty. Review the changes and click on Finish.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/6e08cf9fbb.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/6e08cf9fbb.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We will get a success message.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/10c087b83a.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/10c087b83a.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/4f81fcca2c.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/4f81fcca2c.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="1-establishing-the-connection-to-soa-mds-in-jdeveloper"&gt;1. Establishing the connection to SOA-MDS in Jdeveloper. &lt;a href="#1-establishing-the-connection-to-soa-mds-in-jdeveloper" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Click on File. Click on New. Under all items select SOA-MDS connection. Click Ok&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/b881d098b8.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/b881d098b8.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Specify the Connection Name (MDSConnection1). Select the type of connection to MDS, either File-based or DB based.&lt;/li&gt;
&lt;li&gt;In this example, we will be using File Based MDS. Specify the path to the MDS File location and click on OK.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/80ad18da71.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/80ad18da71.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you want to configure DB based MDS, then you need to either have the MDS DB connection or create a new DB connection to SOA-MDS.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/1eab201e75.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/1eab201e75.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Now the New MDS connection will be created and can be viewed under the resources palette.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/bb4bcc49c5.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/bb4bcc49c5.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Right-click on the SOA_DesignTimeRepository and then select transfer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/b31321c2bf.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/b31321c2bf.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Select the files which you want to transfer and specify the target MDS connection. Click on transfer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/784aa1b240.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/784aa1b240.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The file will be copied to the target MDS location i.e. SOA-MDS location. The file will be on the SOA server.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/c828657250.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/c828657250.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Similarly, to transfer files from SOA server MDS repository to SOA_DesignTimeRepository. Right-click MDSConnection1 and select transfer. Specify the files and click transfer. Here in this case target Connection will be SOA_DesignTimeRepository.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/736bdf51bb.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/736bdf51bb.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="2-using-soa-em-console-or-fusion-middleware-control-console"&gt;2. Using SOA em console or Fusion Middleware control console. &lt;a href="#2-using-soa-em-console-or-fusion-middleware-control-console" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;We can download the complete MDS repository in the .jar/.zip file and import it into our Jdeveloper and vice versa.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To Download or upload MDS repository .jar/.zip file from em console, Login to em console using the URL http://HOST[: PORT]/em. Click on Target Navigation and click on soa-infra.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/ace2c512fc.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/ace2c512fc.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click on SOA Infrastructure. A Dropdown menu will appear. Click on Administration and then click on MDS Configuration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/7bb616dce5.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/7bb616dce5.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On this page, we can import or export the MDS repository in the .jar file. To export click on export. A zip file with the name &amp;ldquo;soa-infra_metadata.zip&amp;rdquo; will be downloaded. Similarly, to import the jar or zip file click on import.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/8e9fb6b777.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/8e9fb6b777.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To import this file in Jdeveloper, right-click on SOA_DesignTimeRepository and click on import from Jar. In case you want to export the file click on Export the Jar and specify the file name.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/aeb990c70b.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/aeb990c70b.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Specify the location of the .jar/zip file containing MDS files. Click on import.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/471c93a6f2.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/471c93a6f2.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; It is always better to use the &lt;a href="#1-establishing-the-connection-to-soa-mds-in-jdeveloper"&gt;first&lt;/a&gt; approach in case files and composites are deployed more on the server.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Read file inside BPEL using Xpath function</title><link>https://blog.deciphermiddleware.in/posts/read-file-inside-bpel-using-xpath/</link><pubDate>Wed, 25 Nov 2020 18:01:00 +0000</pubDate><guid>https://blog.deciphermiddleware.in/posts/read-file-inside-bpel-using-xpath/</guid><description>&lt;p&gt;To read a file in SOA composite, we can use the following options&lt;/p&gt;
&lt;p&gt;1. Using file adapter&lt;br&gt;
2. Using java embedding&lt;br&gt;
3. Using xpath function i.e. ora:readFile()&lt;/p&gt;
&lt;p&gt;We generally use file adapter to read, write or poll files from different file locations. But, in case if don&amp;rsquo;t want to create a file adapter and don&amp;rsquo;t want to go for java embedding. We can make use of BPEL xpath extension functions. In this article, we will discuss about reading a file using xpath function &lt;strong&gt;ora:readFile()&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="xpath-expression"&gt;&lt;strong&gt;Xpath expression:&lt;/strong&gt; &lt;a href="#xpath-expression" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;ora:readFile(&amp;#39;fileName&amp;#39;,[&amp;#39;schemaLocation&amp;#39;],[&amp;#39;rootElement&amp;#39;])
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;p&gt;xmlns:ora = **&lt;a href="http://schemas.oracle.com/xpath/extension"&gt;http://schemas.oracle.com/xpath/extension&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;&amp;lsquo;fileName&amp;rsquo;&lt;/strong&gt; : Refers to absolute path of file along with extension. This is mandatory field.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;lsquo;schemaLocation&amp;rsquo;&lt;/strong&gt; : Refers to location of nxsd schema for the file to be read. This is an optional field. If you don&amp;rsquo;t provide the schema location, then data from the file will be read and converted to base64 encoded string&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;lsquo;rootElement&amp;rsquo;&lt;/strong&gt; : Refers to root element in nxsd schema. This is optional field but required if we provide schema location.&lt;/p&gt;
&lt;h3 id="example"&gt;Example: &lt;a href="#example" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Sample CSV&lt;/strong&gt; file with absolute file path: &lt;strong&gt;&lt;em&gt;C:\Users\test\SOA\test1.csv&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csv" data-lang="csv"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;S.No&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;Field1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;Field2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;Field3 &lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;t1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;t2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;t3 &lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;s1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;s2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;s3&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Sample NXSD Schema:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xsd" data-lang="xsd"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;xsd:schema&lt;/span&gt; &lt;span class="na"&gt;xmlns:xsd=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://www.w3.org/2001/XMLSchema&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;xmlns:nxsd=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://xmlns.oracle.com/pcbpel/nxsd&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;xmlns:tns=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://TargetNamespace.com/ServiceName&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;targetNamespace=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://TargetNamespace.com/ServiceName&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;elementFormDefault=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;qualified&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;attributeFormDefault=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;unqualified&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;nxsd:version=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;NXSD&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;nxsd:stream=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;chars&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;nxsd:encoding=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;nxsd:hasHeader=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;true&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;nxsd:headerLines=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;nxsd:headerLinesTerminatedBy=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;${eol}&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Root-Element&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;xsd:complexType&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;xsd:sequence&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;row&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;minOccurs=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;maxOccurs=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;unbounded&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;xsd:complexType&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;xsd:sequence&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;S.No&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;xsd:string&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;nxsd:style=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;terminated&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;nxsd:terminatedBy=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;,&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;nxsd:quotedBy=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;amp;quot;&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Field1&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;xsd:string&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;nxsd:style=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;terminated&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;nxsd:terminatedBy=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;,&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;nxsd:quotedBy=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;amp;quot;&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Field2&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;xsd:string&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;nxsd:style=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;terminated&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;nxsd:terminatedBy=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;,&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;nxsd:quotedBy=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;amp;quot;&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;xsd:element&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Field3&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;xsd:string&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;nxsd:style=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;terminated&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;nxsd:terminatedBy=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;${eol}&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;nxsd:quotedBy=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;amp;quot;&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/xsd:sequence&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/xsd:complexType&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/xsd:element&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/xsd:sequence&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/xsd:complexType&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/xsd:element&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/xsd:schema&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;XPath statement without schema, which will give output as base64 schema.&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; ora:readFile(&amp;#39;file:///C:/Users/test/SOA/test1.csv&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/5a4665da22.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/5a4665da22.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/02eec04c2c.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/02eec04c2c.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Uy5ObyxGaWVsZDEsRmllbGQyLEZpZWxkMw0KMSx0MSx0Mix0Mw0KMixzMSxzMixzMw0K
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Xpath statement with schema, which will give output as xml&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ora:readFile('file:///C:/Users/test/SOA/test1.csv','Schemas/nxsd_schema1.xsd','Root-Element')
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/e475840131.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/e475840131.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/3bdebf4a09.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/3bdebf4a09.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;Root-Element&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://TargetNamespace.com/ServiceName&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;row&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;S.No&amp;gt;&lt;/span&gt;1&lt;span class="nt"&gt;&amp;lt;/S.No&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;Field1&amp;gt;&lt;/span&gt;t1&lt;span class="nt"&gt;&amp;lt;/Field1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;Field2&amp;gt;&lt;/span&gt;t2&lt;span class="nt"&gt;&amp;lt;/Field2&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;Field3&amp;gt;&lt;/span&gt;t3&lt;span class="nt"&gt;&amp;lt;/Field3&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/row&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;row&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;S.No&amp;gt;&lt;/span&gt;2&lt;span class="nt"&gt;&amp;lt;/S.No&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;Field1&amp;gt;&lt;/span&gt;s1&lt;span class="nt"&gt;&amp;lt;/Field1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;Field2&amp;gt;&lt;/span&gt;s2&lt;span class="nt"&gt;&amp;lt;/Field2&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;Field3&amp;gt;&lt;/span&gt;s3&lt;span class="nt"&gt;&amp;lt;/Field3&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/row&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/Root-Element&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Using either of the above statements we can read file in assign activity directly, without using file adapter or java embedding.&lt;/p&gt;</description></item><item><title>XML to String and String to XML conversion</title><link>https://blog.deciphermiddleware.in/posts/xml-to-string-and-string-to-xml/</link><pubDate>Thu, 24 Sep 2020 00:00:00 +0000</pubDate><guid>https://blog.deciphermiddleware.in/posts/xml-to-string-and-string-to-xml/</guid><description>&lt;h2 id="use-cases"&gt;Use Cases &lt;a href="#use-cases" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Many a times, we may need to convert xml data and pass it as a string inside an XML tag.&lt;/li&gt;
&lt;li&gt;Sometimes from source, we get data which is in string format but actually is xml encoded in string format.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;To do so in Oracle BPEL 12c or OSB 12c we can use built in functions.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="xml-data-to-string"&gt;XML data to String &lt;a href="#xml-data-to-string" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;h3 id="sample-input"&gt;Sample input &lt;a href="#sample-input" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;inRoot&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;t1&amp;gt;&lt;/span&gt;Hello&lt;span class="nt"&gt;&amp;lt;/t1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;t2&amp;gt;&lt;/span&gt;World&lt;span class="nt"&gt;&amp;lt;/t2&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;t3&amp;gt;&lt;/span&gt;One&lt;span class="nt"&gt;&amp;lt;/t3&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/inRoot&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="sample-output"&gt;Sample output &lt;a href="#sample-output" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;outRoot&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;&amp;lt;t1&amp;gt;&lt;/span&gt;&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;inRoot&lt;span class="ni"&gt;&amp;amp;gt;&amp;amp;lt;&lt;/span&gt;t1&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;Hello&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;/t1&lt;span class="ni"&gt;&amp;amp;gt;&amp;amp;lt;&lt;/span&gt;t2&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;World&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;/t2&lt;span class="ni"&gt;&amp;amp;gt;&amp;amp;lt;&lt;/span&gt;t3&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;One&lt;span class="ni"&gt;&amp;amp;lt;&lt;/span&gt;/t3&lt;span class="ni"&gt;&amp;amp;gt;&amp;amp;lt;&lt;/span&gt;/inRoot&lt;span class="ni"&gt;&amp;amp;gt;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/t1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/outRoot&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="xslt"&gt;XSLT &lt;a href="#xslt" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This can be accomplished by using the function oraext:get-content-as-string(element as node-set). This function is really helpful when we are working on BPEL as we can use this function in ASSIGN activity or in TRANSFORM activity using XSLT.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;xmlns:oraext&lt;/strong&gt;=&amp;ldquo;&lt;a href="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.ExtFunc%22"&gt;http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.ExtFunc&amp;quot;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;element as node-set:&lt;/strong&gt; xml data(can be variable, xpath, or a function that returns xml data)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="example"&gt;Example: &lt;a href="#example" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xslt" data-lang="xslt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;outRoot&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;t1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;xsl:value-of&lt;/span&gt; &lt;span class="na"&gt;select&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;oraext:get-content-as-string(/ns0:inRoot)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;t1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;outRoot&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="xquery"&gt;XQuery &lt;a href="#xquery" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Xquery too have a function to convert xml to string i.e. &lt;strong&gt;fn-bea:serialize($arg as item()*)&lt;/strong&gt; as xs:string. This function is really helpful when we are dealing with OSB.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;xmlns:fn-bea=&amp;ldquo;&lt;a href="http://www.bea.com/xquery/xquery-functions%22"&gt;http://www.bea.com/xquery/xquery-functions&amp;quot;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;$arg: Variable containing XML data.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="example-1"&gt;Example: &lt;a href="#example-1" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;$input contains xml data that needs to be converted and assigned to one tag in output payload.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;outRoot&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;t1&amp;gt;&lt;/span&gt;{fn-bea:serialize($input)}&lt;span class="nt"&gt;&amp;lt;/t1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/outRoot&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="string-to-xml"&gt;String to XML &lt;a href="#string-to-xml" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;h3 id="sample-input-1"&gt;Sample input &lt;a href="#sample-input-1" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;#39;&amp;amp;lt;inRoot&amp;amp;gt;&amp;amp;lt;t1&amp;amp;gt;Hello&amp;amp;lt;/t1&amp;amp;gt;&amp;amp;lt;t2&amp;amp;gt;World&amp;amp;lt;/t2&amp;amp;gt;&amp;amp;lt;t3&amp;amp;gt;One&amp;amp;lt;/t3&amp;amp;gt;&amp;amp;lt;/inRoot&amp;amp;gt;&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="sample-output-1"&gt;Sample output &lt;a href="#sample-output-1" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;inRoot&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;t1&amp;gt;&lt;/span&gt;Hello&lt;span class="nt"&gt;&amp;lt;/t1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;t2&amp;gt;&lt;/span&gt;World&lt;span class="nt"&gt;&amp;lt;/t2&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;t3&amp;gt;&lt;/span&gt;One&lt;span class="nt"&gt;&amp;lt;/t3&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/inRoot&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As we can see in above example that &amp;lt; and &amp;gt; are replaced with &amp;amp;lt; and &amp;amp;gt;. In xml &amp;lt; and &amp;gt; are invalid characters and escaper characters are used in place of these.&lt;/p&gt;
&lt;h2 id="xslt-1"&gt;XSLT &lt;a href="#xslt-1" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;In xslt, we can use built in function &lt;strong&gt;oraext:parseXML(stringData)&lt;/strong&gt;.This function is really helpful when we are working on BPEL as we can use this function in ASSIGN activity or in TRANSFORM activity using XSLT.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;xmlns:oraext=&amp;ldquo;&lt;a href="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.ExtFunc%22"&gt;http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.ExtFunc&amp;quot;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;stringData: string value of xml data.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="example-2"&gt;Example: &lt;a href="#example-2" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xslt" data-lang="xslt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;xsl:copy-of&lt;/span&gt; &lt;span class="na"&gt;select&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;oraext:parseXML(&amp;#39;&amp;amp;lt;inRoot&amp;amp;gt;&amp;amp;lt;t1&amp;amp;gt;Hello&amp;amp;lt;/t1&amp;amp;gt;&amp;amp;lt;t2&amp;amp;gt;World&amp;amp;lt;/t2&amp;amp;gt;&amp;amp;lt;t3&amp;amp;gt;One&amp;amp;lt;/t3&amp;amp;gt;&amp;amp;lt;/inRoot&amp;amp;gt;&amp;#39;)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Note: we have used copy-of instead of value-of as we need all the xml nodes to be copied to the target file. If we want to extract the data from xml without xml tags then we can use value-of.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="xquery-1"&gt;XQuery &lt;a href="#xquery-1" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;In xquery, we can use fn-bea:inlinedXML($arg as xs:string) as node()*. This function is really helpful when we are dealing with OSB.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;xmlns:fn-bea=&amp;ldquo;&lt;a href="http://www.bea.com/xquery/xquery-functions%22"&gt;http://www.bea.com/xquery/xquery-functions&amp;quot;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;$arg: variable containing xml data in string format.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="example-3"&gt;Example: &lt;a href="#example-3" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;fn-bea:inlinedXML(&amp;#39;&amp;amp;lt;inRoot&amp;amp;gt;&amp;amp;lt;t1&amp;amp;gt;Hello&amp;amp;lt;/t1&amp;amp;gt;&amp;amp;lt;t2&amp;amp;gt;World&amp;amp;lt;/t2&amp;amp;gt;&amp;amp;lt;t3&amp;amp;gt;One&amp;amp;lt;/t3&amp;amp;gt;&amp;amp;lt;/inRoot&amp;amp;gt;&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Remove Empty tags using XSLT</title><link>https://blog.deciphermiddleware.in/posts/remove-empty-tags-using-xslt/</link><pubDate>Sun, 13 Sep 2020 00:00:00 +0000</pubDate><guid>https://blog.deciphermiddleware.in/posts/remove-empty-tags-using-xslt/</guid><description>&lt;p&gt;While performing xslt transform on source XML, we may need not to include empty tags in the output xml payload.&lt;/p&gt;
&lt;h2 id="sample-scenarios"&gt;Sample scenarios: &lt;a href="#sample-scenarios" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Target system doesn&amp;rsquo;t want empty tags to come.&lt;/li&gt;
&lt;li&gt;Size of xml payload has become huge due to unwanted empty tags.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="source-xml"&gt;Source XML &lt;a href="#source-xml" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;inRoot&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;t1&amp;gt;&lt;/span&gt;Hello&lt;span class="nt"&gt;&amp;lt;/t1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;t2&amp;gt;&amp;lt;/t2&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;t3&amp;gt;&lt;/span&gt;World&lt;span class="nt"&gt;&amp;lt;/t3&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/inRoot&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="output-xml"&gt;Output XML &lt;a href="#output-xml" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;outRoot&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;a1&amp;gt;&lt;/span&gt;Hello&lt;span class="nt"&gt;&amp;lt;/a1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;a3&amp;gt;&lt;/span&gt;World&lt;span class="nt"&gt;&amp;lt;/a3&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/outRoot&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The optimal way to achieve above result is to use conditional if statement in xslt i.e. xsl:if&lt;/p&gt;
&lt;h3 id="sample-xslt"&gt;Sample XSLT &lt;a href="#sample-xslt" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xslt" data-lang="xslt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;xsl:if&lt;/span&gt; &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/inRoot/t2!=&amp;#39;&amp;#39;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;xsl:value-of&lt;/span&gt; &lt;span class="na"&gt;select&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ns0:C1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;xsl:if&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If we have some whitespaces included between tags, the above if-statement may fail and in such scenarios, we may use normalize-space() function in xslt and test condition will become : &lt;strong&gt;&amp;ldquo;normalize-space(/inRoot/t2)!=&amp;rsquo;&amp;rsquo;&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sometimes, we just want to remove empty elements from already transformed xml. Such cases have same input and output schemas. In such scenarios we can take leverage of identity transform using xsl templates and copy methods. See the below sample xslt identity transform to remove empty tags.&lt;/p&gt;
&lt;h3 id="sample-xslt-1"&gt;Sample XSLT: &lt;a href="#sample-xslt-1" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xslt" data-lang="xslt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;xsl:template&lt;/span&gt; &lt;span class="na"&gt;match&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;node()|@*&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;xsl:if&lt;/span&gt; &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;normalize-space(.) !=&amp;#39;&amp;#39; or ./@* !=&amp;#39;&amp;#39;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;xsl:copy&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;xsl:copy-of&lt;/span&gt; &lt;span class="na"&gt;select&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;@*&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;xsl:apply-templates&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;xsl:copy&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;xsl:if&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;xsl:template&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If we are using xslt in JDev, we need to specify input and output schemas and replace &lt;strong&gt;xsl:template&lt;/strong&gt; tag with the above xsl template code.&lt;/p&gt;</description></item><item><title>Format String oraext:format-string</title><link>https://blog.deciphermiddleware.in/posts/format-string-oraextformat-string/</link><pubDate>Sat, 05 Sep 2020 00:00:00 +0000</pubDate><guid>https://blog.deciphermiddleware.in/posts/format-string-oraextformat-string/</guid><description>&lt;p&gt;In our integration world, sometimes target system requires the data from source system to be formatted in some specific format which may require data from various input fields along with custom data. To do so we generally use concat() function to concatenate data from various fields and some user specific inputs.&lt;/p&gt;
&lt;p&gt;Lets take the below example&lt;/p&gt;
&lt;p&gt;Suppose we have a predefined format for the output string:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The &lt;strong&gt;abc&lt;/strong&gt; with employeeID: &lt;strong&gt;1234567&lt;/strong&gt; has been successfully registered in the system.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here, name of the employee(&lt;strong&gt;$empName&lt;/strong&gt;=&amp;lsquo;abc&amp;rsquo;) and employee id(&lt;strong&gt;$empId&lt;/strong&gt;=&amp;lsquo;1234567&amp;rsquo;) are dynamic values. One way to accomplish this, is to use concat().&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;concat(&amp;#39;The &amp;#39;,$empName,&amp;#39; with employeeID: &amp;#39;,$empId,&amp;#39; has been successfully registered in the system.&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Another way we can achieve this, is using oraext:format-string(string,string,string&amp;hellip;)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;oraext:format-string (&amp;#39;The {0} with employeeID: {1} has been successfully registered in the system.&amp;#39;,$empName, $empId)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In above example, first string defines the output format containing place holders({0},{1}). These place holders will be replaced by the subsequent string values(&lt;strong&gt;$empName&lt;/strong&gt;=&amp;lsquo;abc&amp;rsquo;, &lt;strong&gt;$empId&lt;/strong&gt;=&amp;lsquo;1234567&amp;rsquo;). In future, if we need to change the position of these dynamic value in output string, all we need to do is to move the position of these placeholders.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Maximum of 10 arguments are supported for this function.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>DateTime formatting using xp20:format-dateTime()</title><link>https://blog.deciphermiddleware.in/posts/datetime-formatting-using-xp20format/</link><pubDate>Wed, 02 Sep 2020 00:00:00 +0000</pubDate><guid>https://blog.deciphermiddleware.in/posts/datetime-formatting-using-xp20format/</guid><description>&lt;h2 id="xsdatetime-format"&gt;xs:dateTime Format &lt;a href="#xsdatetime-format" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;In XML, we generally use xs:dateTime(xs:xmlns=&amp;ldquo;&lt;a href="http://www.w3.org/2001/XMLSchema%22"&gt;http://www.w3.org/2001/XMLSchema&amp;quot;&lt;/a&gt;) data type to store date time data. The generic representation of date time, that is supported by xs:dateTime in xml:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;YYYY-MM-DDThh:mm:ss[.SSS][Z|(+|-)hh:mm]&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="example"&gt;Example: &lt;a href="#example" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;2019-09-11T10:16:31.943+05:30&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;YYYY&lt;/td&gt;
&lt;td&gt;represents a 4-digit year&lt;/td&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MM&lt;/td&gt;
&lt;td&gt;represents a 2-digit month&lt;/td&gt;
&lt;td&gt;09&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DD&lt;/td&gt;
&lt;td&gt;represents 2-digit date&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hh&lt;/td&gt;
&lt;td&gt;represents 2-digit hours&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mm&lt;/td&gt;
&lt;td&gt;represents minutes in 2-digits&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ss&lt;/td&gt;
&lt;td&gt;represents seconds in 2-digits&lt;/td&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSS&lt;/td&gt;
&lt;td&gt;represents milliseconds&lt;/td&gt;
&lt;td&gt;943&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T&lt;/td&gt;
&lt;td&gt;represents time separator&lt;/td&gt;
&lt;td&gt;T&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Z&lt;/td&gt;
&lt;td&gt;represents UTC time zone or 0 time zone offset&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;(+|-)&lt;/td&gt;
&lt;td&gt;hh:mm represents time zone offset&lt;/td&gt;
&lt;td&gt;+5:30&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Few more valid &lt;strong&gt;examples&lt;/strong&gt;: 2019-09-11T21:32:52, 2019-09-11T21:32:52+02:00, 2019-09-11T19:32:52Z, 2019-09-11T19:32:52+00:00, 2019-09-11T21:32:52.11179&lt;/p&gt;
&lt;p&gt;While working with different systems, we may come across such systems, which require date time in some different formats other than default format as supported by xs:dateTime. To over come such scenarios, function is available in OIC(Oracle Integration Cloud) and Oracle SOA&lt;/p&gt;
&lt;h2 id="format-datetime"&gt;Format DateTime &lt;a href="#format-datetime" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;xp20:format-dateTime($dateTime as string, $format as string) xmlns:xp20=&amp;quot;http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.Xpath20&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;$dateTime&lt;/strong&gt; should contain date time value as per xs:dateTime data type as as string eg: &amp;lsquo;2019-09-11T10:16:31.943+05:30&amp;rsquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;$format&lt;/strong&gt; should contain output format to which we need to convert to. For e.g. if we want output to be &amp;lsquo;11/09/2019&amp;rsquo; then value of $format should be &lt;code&gt;[D01]/[M01]/[Y001]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;xp20:format-dateTime('2019-09-11T10:16:31.943+05:30', '[D01]/[M01]/[Y001]')&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;To format current date time, we can use xp20:current-dateTime() in $dateTime&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;xp20:format-dateTime(xp20:current-dateTime(), &amp;#39;[D01]/[M01]/[Y001]&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="formatting-codes"&gt;Formatting Codes: &lt;a href="#formatting-codes" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Below are some important codes which can be helpful in generating desired format for target application.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Sample dateTime:&lt;/strong&gt;&lt;/em&gt; &lt;code&gt;2019-09-03T15:16:31.943+05:30&lt;/code&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example Output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;[Y001]&lt;/td&gt;
&lt;td&gt;4 digit year&lt;/td&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[Y01]&lt;/td&gt;
&lt;td&gt;2 digit year&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[M01]&lt;/td&gt;
&lt;td&gt;2 digit month&lt;/td&gt;
&lt;td&gt;09&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[D01]&lt;/td&gt;
&lt;td&gt;2 digit date&lt;/td&gt;
&lt;td&gt;03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[H01]&lt;/td&gt;
&lt;td&gt;2 digit hour in 24 hour clock&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[h01]&lt;/td&gt;
&lt;td&gt;2 digit hour in 12 hour clock&lt;/td&gt;
&lt;td&gt;03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[m01]&lt;/td&gt;
&lt;td&gt;2-digit minutes&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[s01]&lt;/td&gt;
&lt;td&gt;2-digit seconds&lt;/td&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[f001]&lt;/td&gt;
&lt;td&gt;3-digit milliseconds&lt;/td&gt;
&lt;td&gt;943&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[Z]&lt;/td&gt;
&lt;td&gt;Time zone offset in the form (+|-)hhmm&lt;/td&gt;
&lt;td&gt;+0530&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[z]&lt;/td&gt;
&lt;td&gt;Time zone offset in the form GMT(+|-)hh:mm&lt;/td&gt;
&lt;td&gt;GMT+05:30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[Dwo]&lt;/td&gt;
&lt;td&gt;Word for ordinal value of day&lt;/td&gt;
&lt;td&gt;third&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[dwo]&lt;/td&gt;
&lt;td&gt;The day of the year, represented in ordinal words&lt;/td&gt;
&lt;td&gt;second hundred and forty-sixth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[MNn]&lt;/td&gt;
&lt;td&gt;Capitalized month name&lt;/td&gt;
&lt;td&gt;September&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[P]&lt;/td&gt;
&lt;td&gt;am/pm&lt;/td&gt;
&lt;td&gt;pm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[PX]&lt;/td&gt;
&lt;td&gt;Uppercase am/pm&lt;/td&gt;
&lt;td&gt;PM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[FNn]&lt;/td&gt;
&lt;td&gt;Capitalized weekday name&lt;/td&gt;
&lt;td&gt;Tuesday&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[MNn,a-b]&lt;/td&gt;
&lt;td&gt;Capitalized month name having atleast &amp;ldquo;a&amp;rdquo; charcters and atmost &amp;ldquo;b&amp;rdquo; characters [MNn,3-3]:&lt;/td&gt;
&lt;td&gt;Sep&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description></item></channel></rss>