This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

RE: How to delete empty element tag from output XML?


Thank you Michael for your help. I try your suggestion but still have
trouble. Maybe my question is not clear before. I give a scenario below.

Input XML:
<?xml version="1.0" encoding="UTF-8"?>
<test>
	<people>
		<N1>Tom</N1>
		<N2>Hopkins</N2>
		<N3 />
		<Sex>Male</Sex>
	</people>
	<people>
		<N1>Amy</N1>
		<N2>Smith</N2>
		<N3>R</N3> 
		<Sex />
	</people>
</test>

Expected output XML:
<?xml version="1.0" encoding="UTF-8"?>
<NameList>
	<My_Favorite>
		<Star>
			<FirstName>Tom</FirstName>
			<LastName>Hopkins</LastName>
			<MI>N/A</MI>
			<Gender>Male</Gender>
		</Star>
		<Star>
			<FirstName>Amy</FirstName>
			<LastName>Smith</LastName>
			<MI>R</MI>
		</Star>
	</My_Favorite>
</NameList>

You may notice 
1). if <Sex> is empty as in Amy case, don't print <Gender /> 
2). if <N3> is empty as in Tom case, I need a output <MI>N/A</MI>, i.e. a
default of "N/A".
3). the structure and tag of output different with input.
As I mentioned before, the last thing I want to do is use <xsl:if> in XSLT
stylesheet to compare every segment because it's too tedious given the fact
I have numberous tags need to process.

Thanks again. have a good day.

Guangzu

 
-----Original Message-----
From: Kay Michael [mailto:Michael.Kay@icl.com]
Sent: Wednesday, October 25, 2000 4:32 AM
To: 'xsl-list@mulberrytech.com'
Subject: RE: How to delete empty element tag from output XML?


> I use XSLT to convert XML to XML and HTML. I need to delete 
> the tag when
> there are no value in the output. for example, I have XSLT as 
> following:
> 	<NAME><xsl:value-of select="N1" /></NAME>
> I don't need <NAME /> or <NAME> </NAME>.
> One way I can do it is use <xsl:if> outside of <Name> tag, 
> but that's too
> much for me because I have a lot of similar tags.

Try 
<xsl:template match="*" mode="copy-unless-empty">
 <xsl:if test="node()">
  <xsl:copy>
   <xsl:copy-of select="@*"/>
   <xsl:value-of select="."/>
  </xsl:copy>
 </xsl:if>
</xsl:template>

and then use <xsl:apply-templates mode="copy-unless-empty"/>
to process these elements.

> 
> Another related question is that some time I need put a 
> default value if nothing there.

A similar technique should do the trick.

Mike Kay 


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]