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
bob williamsSubject: XML data import with XSL Stylesheet and missing child node
Author: bob williams
Date: 05 Oct 2007 05:28 PM
Originally Posted: 02 Oct 2007 07:45 PM
I'm a newbie.... So if my explanation leaves a bit to be desired I'm sorry. But basically I need to create a child node if one doesn't exist.

I am importing data via XML into my database so I don't want to wade through any HTML design if possible to find what I need.

Here's what I have: 1 record with several items of data importing using my XSL Stylesheet. Repeating data into separate fields...

Simplified example of XML data nodes:

<items>
<Item>
<ItemName><DatePurchased><LastSaleDate><Cost><ListPrice>
</item>
<Item>
<ItemName><DatePurchased><Cost><ListPrice>
</item>
<Item>
<ItemName><DatePurchased><LastSaleDate><Cost><ListPrice>
</item>
</items>

Data coming into each field:

ItemName,DatePurchased, LastSaleDate, Cost, ListPrice,
shelf1, 1/1/2007, 2/2/2007 ,$10.00,$20.00
shelf2, 1/1/2007,(Empty so no node present),$10.00,$17.50
shelf3, 1/1/2007, 2/2/2007 ,$10.00,$20.00

But it looks like:
Field1 field2 field3 field4 field5
shelf1, 1/1/2007 2/2/2007 $10.00 $20.00
shelf2, 1/1/2007 2/2/2007 $10.00 $17.50
shelf3, 1/1/2007 (moved up) $10.00 $20.00

Problem: The data below the missing child node moves up in the field.

I'm using <xsl:for-each> and <xsl:value-of select="." /> as such...

<COL>
<DATA>
<xsl:for-each select="Items/Item/ItemName" > ***Reason if I get an error it comes in under <Items><Error Message> ****
<xsl:value-of select="." />
<xsl:text>
</xsl:text>
</xsl:for-each>
</DATA>
</COL>
<COL>

<COL>
<DATA>
<xsl:for-each select="Items/Item/DatePurchased" >
<xsl:value-of select="." />
<xsl:text>
</xsl:text>
</xsl:for-each>
</DATA>
</COL>
<COL>

You get the idea.......

I've read a lot but I'm out of time and need to finish this so I can get back to my real job.

Postnext
James DurningSubject: XML data import with XSL Stylesheet and missing child node
Author: James Durning
Date: 03 Oct 2007 10:22 AM
If you want to check that each of them are there, either you need to hard code or you need to do some more complex coding:

<xsl:for-each select="Items/Item">
<DatePurchased><xsl:value-of select="DatePurchased"/></DatePurchased>
<LastSaleDate><xsl:value-of select="LastSaleDate"/></LastSaleDate>
<Cost><xsl:value-of select="Cost"/></Cost>
<ListPrice><xsl:value-of select="ListPrice"/></ListPrice>
</xsl:for-each>

Postnext
James DurningSubject: XML data import with XSL Stylesheet and missing child node
Author: James Durning
Date: 04 Oct 2007 01:34 PM
Originally Posted: 04 Oct 2007 01:32 PM
Ah, I realize I made a mistake in assuming your output. It should be more like:
<xsl:for-each select="Items/Item">
<COL><DATA><DatePurchased><xsl:value-of select="DatePurchased"/></DatePurchased></COL></DATA>
<COL><DATA><LastSaleDate><xsl:value-of select="LastSaleDate"/></LastSaleDate></COL></DATA>
<COL><DATA><Cost><xsl:value-of select="Cost"/></Cost></COL></DATA>
<COL><DATA><ListPrice><xsl:value-of select="ListPrice"/></ListPrice></COL></DATA>
</xsl:for-each>

Ok, step by step then:
1.
<xsl:for-each select="Items/Item/ItemName">
...
<xsl:for-each select="Item/DatePurchased">
All of the ItemName items will be before the DatePurchased items. Is this ok? I had assumed you wanted all of the data for an item on a single row.
Other Problems with this: this template is only applied IF the node exists. Since you say it doesn't always exist, that causes a problem.
You need to move the if clause earlier.


2.
<xsl:for-each select="Item/DatePurchased">
<xsl:choose>
...
<xsl:when test="DatePurchased">
Problems here: This assumes you have a DatePurchased node inside the DatePurchased Node, eg:
<Item>
<DatePurchased>
<DatePurchased>.... </DatePurchased>
which you do not. Since you don't, it automatically skips all of the for-each code when the node's not there.


3.
<xsl:element name= "DatePurchased">
...
</xsl:element>
You can simplify this to just:
<DatePurchased>
...
</DatePurchased>
Assuming you have not set the default xmlns attribute.

Posttop
bob williamsSubject: XML data import with XSL Stylesheet and missing child node
Author: bob williams
Date: 06 Oct 2007 06:18 PM
Originally Posted: 04 Oct 2007 05:08 PM
UPDATE:
James was right I just didn't see it.... sorry!!!

So now I have fixed it and added a little for my purpose:

<COL><DATA><xsl:for-each select="abc:Item"><xsl:value-of select="abc:LastSaleDate"/><xsl:if test="not(abc:LastSaleDate)"><xsl:text>none..... this could be blank or empty</xsl:text></xsl:if><xsl:text>& # 0 1 0 ;</xsl:text></xsl:for-each></DATA></COL>>

I knew it should be simple..........

 
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.