[Webinar] Streamline your web hosting managementRegister Today

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1216
  • 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

[Webinar] Improve your customer journey

A positive customer journey is important in attracting and retaining business. To improve this experience, you can use Google Maps APIs to increase checkout conversions, boost user engagement, and optimize order fulfillment. Learn how in this webinar presented by Dito.

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