[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1201
  • Last Modified:

In PowerBuilder, how can i hide those tag in xml export file when there is a null value being returned from the datawindow? E.g from the script below, <Name/><Initials>SRM</Initials>, hide <Name/>

In PowerBuilder, how can i hide those tag in xml export file when there is a null value being returned from the datawindow?  
E.g from the script below, <Name/><Initials>SRM</Initials>,  i wish to hide <Name/> for being displayed in the XML file

Let me further explain my problems encountered in Powerbuilder Exported XML

Sample Scenario as below:
<Name>Johnson<MarriageDate>2001-09-09</MarriageDate></Name>
<Name>Marry<MarriageDate/></Name>
<Name>Jeannie<MarriageDate>2008-08-08</MarriageDate></Name>

Because MarriageDate element is expecting a date value, passing empty element <MarriageDate/> will cause validation error when importing the exported XML. Is there any way/workaround to resolve this to have output XML like sample below?

<Name>Johnson<MarriageDate>2001-09-09</MarriageDate></Name>
<Name>Marry</Name>
<Name>Jeannie<MarriageDate>2008-08-08</MarriageDate></Name>

0
orinauts
Asked:
orinauts
  • 2
1 Solution
 
abelCommented:
The simplest method to remove empty elements is to use XSLT. I don't know enough of PowerBuilder to do that by code, but if you know the basics, it seems that this article shows you how to do it: http://www.sybase.com/detail?id=1013844

Then I can help you with the XSLT part, which looks like this:

-- Abel --

<!-- ----------------------------------------------- -->
<!-- XSLT part, copies all except the empty elements -->
<!-- ----------------------------------------------- -->
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:output method="xml" indent="yes"/>
    
    <!-- copy template, copies every element/node/text/attr -->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" />
        </xsl:copy>
    </xsl:template>
 
    <!-- a "delete"-template to remove all contents of diffgr:before -->
    <xsl:template match="*[not(text())]" />
    
</xsl:stylesheet>
 
 
 
<!-- ----------------------------------------------- -->
<!-- your input (amended with a root to make it XML) -->
<!-- ----------------------------------------------- -->
<?xml version="1.0" encoding="utf-8"?>
<root>
    <Name>Johnson<MarriageDate>2001-09-09</MarriageDate></Name>
    <Name>Marry<MarriageDate/></Name>
    <Name>Jeannie<MarriageDate>2008-08-08</MarriageDate></Name>
</root>
 
 
 
<!-- --------------------------------- -->
<!-- the output after run against XSLT -->
<!-- --------------------------------- -->
<?xml version="1.0" encoding="utf-8"?>
<root>
    <Name>Johnson<MarriageDate>2001-09-09</MarriageDate></Name>
    <Name>Marry</Name>
    <Name>Jeannie<MarriageDate>2008-08-08</MarriageDate></Name>
</root>

Open in new window

0
 
abelCommented:
sorry for that wrong comment about diffgr:before, that was from something else. But it *is* a delete template and it removes all elements that do not contain any text content.
0

Featured Post

VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now