473,400 Members | 2,163 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,400 software developers and data experts.

Removing empty nodes

I have an XML file that contains some empty nodes like:

Expand|Select|Wrap|Line Numbers
  1. <sample>
  2.    <test/>
  3.    <test1/>
  4. </sample>
  5.  
I am using Saxon 8.8 to transform this XML into another XML file, but I'd like to remove the empty nodes and leave the rest of the document as it was.

XML:

Expand|Select|Wrap|Line Numbers
  1. <?xml version="1.0" ?>
  2.  
  3. <ROOT>
  4.     <CRITERION>
  5.         <CRITERION_ID>1000</CRITERION_ID>
  6.         <CRITERION_NAME>TEST</CRITERION_NAME>
  7.     </CRITERION>
  8.     <CRITERION>
  9.         <CRITERION_ID>2000</CRITERION_ID>
  10.         <CRITERION_NAME>TESTA</CRITERION_NAME>
  11.     </CRITERION>
  12.     <CRITERION>
  13.         <CRITERION_ID />
  14.         <CRITERION_NAME />
  15.     </CRITERION>
  16.     <CRITERION>
  17.         <CRITERION_ID>3000</CRITERION_ID>
  18.         <CRITERION_NAME>TESTB</CRITERION_NAME>
  19.     </CRITERION>
  20.     <CRITERION>
  21.         <CRITERION_ID />
  22.         <CRITERION_NAME />
  23.     </CRITERION>
  24. </ROOT>
  25.  
Required result:

Expand|Select|Wrap|Line Numbers
  1. <?xml version="1.0" ?>
  2.  
  3. <ROOT>
  4.     <CRITERION>
  5.         <CRITERION_ID>1000</CRITERION_ID>
  6.         <CRITERION_NAME>TEST</CRITERION_NAME>
  7.     </CRITERION>
  8.     <CRITERION>
  9.         <CRITERION_ID>2000</CRITERION_ID>
  10.         <CRITERION_NAME>TESTA</CRITERION_NAME>
  11.     </CRITERION>
  12.     <CRITERION>
  13.         <CRITERION_ID>3000</CRITERION_ID>
  14.         <CRITERION_NAME>TESTB</CRITERION_NAME>
  15.     </CRITERION>
  16. </ROOT>
  17.  
So far I have partly managed this using the following stylesheet:

Expand|Select|Wrap|Line Numbers
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  3.  
  4. <xsl:output method="xml"/>
  5. <xsl:template match="/">
  6.     <ROOT>
  7.         <xsl:for-each select="//CRITERION">
  8.             <CRITERION>
  9.                 <xsl:copy-of select="CRITERION_ID[normalize-space(.) != '']" />
  10.                 <xsl:copy-of select="CRITERION_NAME[normalize-space(.) != '']" />
  11.             </CRITERION>
  12.         </xsl:for-each>
  13.     </ROOT>
  14. </xsl:template>    
  15.  
  16. </xsl:stylesheet>
  17.  
However, it creates the following:

Expand|Select|Wrap|Line Numbers
  1. <?xml version="1.0" ?>
  2.  
  3. <ROOT>
  4.     <CRITERION>
  5.         <CRITERION_ID>1000</CRITERION_ID>
  6.         <CRITERION_NAME>TEST</CRITERION_NAME>
  7.     </CRITERION>
  8.     <CRITERION>
  9.         <CRITERION_ID>2000</CRITERION_ID>
  10.         <CRITERION_NAME>TESTA</CRITERION_NAME>
  11.     </CRITERION>
  12.     <CRITERION />
  13.     <CRITERION>
  14.         <CRITERION_ID>3000</CRITERION_ID>
  15.         <CRITERION_NAME>TESTB</CRITERION_NAME>
  16.     </CRITERION>
  17.     <CRITERION />
  18. </ROOT>
  19.  
I can see why it does this, but I cannot figure out how to get rid of the empty <CRITERION /> nodes completely.

Any ideas gratefully received.
Mar 20 '07 #1
5 3238
dorinbogdan
839 Expert 512MB
Try this method:
[html]<?xml version="1.0" encoding="UTF-8"?>

<xsl:output method="xml"/>
<xsl:template match="/">
<ROOT>
<xsl:for-each select="//CRITERION">
<xsl:if test="CRITERION_ID[normalize-space(.) != ''] or CRITERION_NAME[normalize-space(.) != '']">
<CRITERION>
<xsl:copy-of select="CRITERION_ID" />
<xsl:copy-of select="CRITERION_NAME" />
</CRITERION>
</xsl:if>
</xsl:for-each>
</ROOT>
</xsl:template>

</xsl:stylesheet>[/html]

If CRITERION_ID is empty but CRITERION_NAME is not empty, or vice-versa, then both are printed.
I don't have Saxon, but opened the xml in IE and it shows the text fine.
Mar 20 '07 #2
Try this method:
[html]<?xml version="1.0" encoding="UTF-8"?>

<xsl:output method="xml"/>
<xsl:template match="/">
<ROOT>
<xsl:for-each select="//CRITERION">
<xsl:if test="CRITERION_ID[normalize-space(.) != ''] or CRITERION_NAME[normalize-space(.) != '']">
<CRITERION>
<xsl:copy-of select="CRITERION_ID" />
<xsl:copy-of select="CRITERION_NAME" />
</CRITERION>
</xsl:if>
</xsl:for-each>
</ROOT>
</xsl:template>

</xsl:stylesheet>[/html]

If CRITERION_ID is empty but CRITERION_NAME is not empty, or vice-versa, then both are printed.
I don't have Saxon, but opened the xml in IE and it shows the text fine.
Genius!!! Thank you Dorin! This does indeed solve the problem!! I had tried an IF tag, but hadn't thought to combine it with an OR.
Thanks again.
Mar 20 '07 #3
dorinbogdan
839 Expert 512MB
You're always welcome.
Be blessed.
Mar 20 '07 #4
dorinbogdan
839 Expert 512MB
Since the problem was solved I'll close the thread.
Mar 21 '07 #5
dorinbogdan
839 Expert 512MB
I re-open the thread in order to allow further comments or suggestions from other members or experts, as per adim request.
Mar 22 '07 #6

Sign in to post your reply or Sign up for a free account.

Similar topics

4
by: Jyrki Keisala | last post by:
Hi, I have an XML file which I want to present as a HTML table, and I'm looking for a quick way of defaulting all empty elements in my XML file to a nbsp (using the   notation) in my XSL...
4
by: n_o_s_p_a__m | last post by:
My xml doc has many <title></title> and <title> in it, meaning the nodes have no content (although some do). How can I test for this? I tried title (doesn't work) I tried //title (doesn't work)...
4
by: Grant Wagner | last post by:
There doesn't seem to be any mechanism to "clear" a node of all it's children (not that its necessary very often, but I have come across situations where I'd like to clear a node of all it's...
0
by: rene.rugerio[at]gmail.com | last post by:
hi forum dumb question here i have this xmldocument which is from a certain xml looping in the nodes i can see which if the attributes are empty the thing here is that i just dont know how to...
6
by: Pavils Jurjans | last post by:
Hello, Here's the sample XML: <sample1></sample1> <sample2/> From many XML books and online documentations, it is said to be just different syntax for the same data. However, when we...
1
by: tMan | last post by:
whats the xpath to get all the empty nodes in a document. in the xml below i want to get the nodes <empty> and <t> all other nodes either have a child node or text in them <root> <test> <se>...
2
by: Greg | last post by:
Hi. I have a rather large xml document (object) that can have one or more nodes with a certain attribute throughout (at ANY depth, not at the same level necessarily). I need to find this...
5
by: Jani Yusef | last post by:
Based on an interview question I heard of but did not know the answer to....... How do you find and remove a loop from a singly linked list? In a google groups search I found the following code...
11
by: David | last post by:
Hi All, I am working on a script that is theoreticaly simple but I can not get it to work completely. I am dealing with a page spit out by .NET that leaves empty tags in the markup. I need a...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.