XML Editor
Sign up for a WebBoard account Sign Up Keyword Search Search More Options... Options
Chat Rooms Chat Help Help News News Log in to WebBoard Log in Not Logged in
Show tree view Topic
Topic Page 1 2 3 4 5 6 7 8 9 Go to previous topicPrev TopicGo to next topicNext Topic
Postnext
graham drummondSubject: xsl:if test statement result to new element
Author: graham drummond
Date: 19 Jul 2011 06:40 AM
Hi,

Quite new to this, and having an issue using XSLT to transform and update XML. I have the XSLT creating 3 new elements and I need the result of an 'if' statement to go into one of the newly create elements. Any help would be much appreciated:

Part of XML:

<Customer>
<MortalityStatus>ALIVE</MortalityStatus>
</Customer>

XSLT:

<xsl:template match="//*[local-name() = 'CommunicationBody']">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
<xsl:element name="Deceased"></xsl:element>
<xsl:element name="FolderDelivery"></xsl:element>
<xsl:element name="Investigation"></xsl:element>
</xsl:copy>
</xsl:template>

<xsl:template match="//*[local-name() = 'MortalityStatus']">
<MortalityStatus>
<xsl:if test="text () ='ALIVE'">true</xsl:if>
</MortalityStatus>
</xsl:template>

Part of Current Output:

<Customer>
<MortalityStatus>true</MortalityStatus>
</Customer>
<Deceased/>
<FolderDelivery/>
<Investigation/>

Required Output:

<Customer>
<MortalityStatus>ALIVE</MortalityStatus>
</Customer>
<Deceased/>
<FolderDelivery>true</FolderDelivery>
<Investigation/>

Which of the 3 folders above it goes in is dependant on their MortalityStatus.

Postnext
Ivan PedruzziSubject: xsl:if test statement result to new element
Author: Ivan Pedruzzi
Date: 20 Jul 2011 07:19 PM
See if the following code helps

Ivan


<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>

<xsl:template match="CommunicationBody">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
<xsl:element name="Deceased"></xsl:element>
<xsl:element name="FolderDelivery">
<xsl:if test="Customer/MortalityStatus ='ALIVE'">
<xsl:text>true</xsl:text>
</xsl:if>
</xsl:element>
<xsl:element name="Investigation"></xsl:element>
</xsl:copy>
</xsl:template>

<xsl:template match="MortalityStatus">
<xsl:copy-of select="."/>
</xsl:template>

<xsl:template match="text()"/>

<xsl:template match="*">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>

</xsl:stylesheet>

Postnext
graham drummondSubject: xsl:if test statement result to new element
Author: graham drummond
Date: 21 Jul 2011 03:40 AM
Originally Posted: 21 Jul 2011 03:38 AM
Hi Ivan, thank you for your help. I can get the elements populated and the 'true' result using the following:

<xsl:template match="//*[local-name() = 'CommunicationBody']">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
<xsl:element name="Deceased"></xsl:element>
<xsl:element name="FolderDelivery"><xsl:element>
<xsl:element name="InvestigationDelivery"></xsl:element>
</xsl:copy>
</xsl:template>

<xsl:template match="//*[local-name() = 'MortalityStatus']">
<MortalityStatus>
<xsl:if test="text ()='ALIVE'">
<xsl:text>true</xsl:text>
</xsl:if>
</MortalityStatus>
</xsl:template>

However, I need the result i.e. 'true' to appear in the FolderDelivery element and not in the MortalityStatus element. I need the MortalityStatus element to remain with 'ALIVE'.

Any ideas?

Posttop
Ivan PedruzziSubject: xsl:if test statement result to new element
Author: Ivan Pedruzzi
Date: 21 Jul 2011 11:39 AM
I advise against match expressions like the following, they are highly inefficient and difficult to maintain

//*[local-name() = 'MortalityStatus']

Have you tried the code I posted?



I also modified your source to match the "required output" as desribed in the original post

Hope this helps
Ivan


===============================
Input XML

<?xml version="1.0"?>
<CommunicationBody>
<Customer>
<MortalityStatus>ALIVE</MortalityStatus>
</Customer>
</CommunicationBody>

===============================
XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>

<xsl:template match="//*[local-name() = 'CommunicationBody']">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
<xsl:element name="Deceased"></xsl:element>
<xsl:element name="FolderDelivery">
<xsl:if test="Customer/MortalityStatus ='ALIVE'">
<xsl:text>true</xsl:text>
</xsl:if>
</xsl:element>
<xsl:element name="InvestigationDelivery"></xsl:element>
</xsl:copy>
</xsl:template>

<xsl:template match="//*[local-name() = 'MortalityStatus']">
<Customer>
<MortalityStatus>
<xsl:if test="text()='ALIVE'">
<xsl:value-of select="."/>
</xsl:if>
</MortalityStatus>
</Customer>
</xsl:template>
</xsl:stylesheet>


===============================
Output XML
<CommunicationBody>
<Customer>
<MortalityStatus>ALIVE</MortalityStatus>
</Customer>
<Deceased/>
<FolderDelivery>true</FolderDelivery>
<InvestigationDelivery/>
</CommunicationBody>

 
Topic Page 1 2 3 4 5 6 7 8 9 Go to previous topicPrev TopicGo to next topicNext Topic
Download A Free Trial of Stylus Studio 6 XML Professional Edition Today! Powered by Stylus Studio, the world's leading XML IDE for XML, XSLT, XQuery, XML Schema, DTD, XPath, WSDL, XHTML, SQL/XML, and XML Mapping!  
go

Log In Options

Site Map | Privacy Policy | Terms of Use | Trademarks
Stylus Scoop XML Newsletter:
W3C Member
Stylus Studio® and DataDirect XQuery ™are from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2016 All Rights Reserved.