Wrox Programmer Forums
Go Back   Wrox Programmer Forums > XML > XSLT
|
XSLT General questions and answers about XSLT. For issues strictly specific to the book XSLT 1.1 Programmers Reference, please post to that forum instead.
Welcome to the p2p.wrox.com Forums.

You are currently viewing the XSLT section of the Wrox Programmer to Programmer discussions. This is a community of software programmers and website developers including Wrox book authors and readers. New member registration was closed in 2019. New posts were shut off and the site was archived into this static format as of October 1, 2020. If you require technical support for a Wrox book please contact http://hub.wiley.com
 
Old September 5th, 2013, 10:16 AM
Registered User
 
Join Date: Sep 2013
Posts: 7
Thanks: 1
Thanked 0 Times in 0 Posts
Default XSLT multiple elements with the same name, same level

I am facing a problem with same name nodes at the same level and specific order. My order depends on the value of their nodes. My XML looks like:
Code:
<edifact>
<LIN>
		<element>
			<value>1</value>
		</element>
		<element>
			<value>96A    90101</value>
			<value>SA</value>
		</element>
	</LIN>
	<IMD>
		<element>
			<value>F</value>
		</element>
		<element>
			<value>8</value>
		</element>
		<element>
			<value>CAR</value>
			<value>XXX</value>
		</element>
	</IMD>
	<IMD>
		<element>
			<value>F</value>
		</element>
		<element>
			<value>180</value>
		</element>
		<element>
			<value>d Touring Edition</value>
			<value>Kom</value>
		</element>
	</IMD>
			<IMD>
		<element>
			<value>F</value>
		</element>
		<element>
			<value>11</value>
		</element>
		<element>
			<value>Fahrername</value>
			<value>Müller, Thomas</value>
		</element>
	</IMD>
	<IMD>
		<element>
			<value>F</value>
		</element>
		<element>
			<value>11</value>
		</element>
		<element>
			<value>Personal-Nr.</value>
			<value>7200</value>
		</element>
	</IMD>
		<MOA>
		<element>
			<value>203</value>
			<value>381.95</value>
		</element>
	</MOA>
	<RFF>
		<element>
			<value>AKV</value>
			<value>88240</value>
		</element>
	</RFF>
	<RFF>
		<element>
			<value>LI</value>
			<value>1</value>
		</element>
	</RFF>
	<TAX>
		<element>
			<value>7</value>
		</element>
		<element>
			<value>VAT</value>
		</element>
				<element>
			<value></value>
			<value></value>
			<value></value>
			<value>19.00</value>
		</element>
		<element>
			<value>S</value>
		</element>
	</TAX>
	<MOA>
		<element>
			<value>124</value>
			<value>72.57</value>
		</element>
	</MOA>
	<NAD>
		<element>
			<value>BV</value>
		</element>
		<element>
			<value>bt-ax 303</value>
		</element>
	</NAD>
Repeat more OBJECTS	
<LIN>
		<element>
			<value>2</value>
		</element>
		<element>
			<value></value>
		</element>
		<element>
			<value>96A    90103</value>
			<value>SA</value>
		</element>
	</LIN>
	<IMD>
		<element>
			<value>F</value>
		</element>
		<element>
			<value>8</value>
		</element>
		<element>
			<value>CAR</value>
			<value>XXX</value>
		</element>
	</IMD>
	<IMD>
		<element>
			<value>F</value>
		</element>
		<element>
			<value>180</value>
		</element>
		<element>
			<value>d coupe Edition</value>
			<value>Kom</value>
		</element>
	</IMD>
	<IMD>
		<element>
			<value>F</value>
		</element>
		<element>
			<value>11</value>
		</element>
		<element>
			<value>Fahrername</value>
			<value>Burros, Thomas</value>
		</element>
	</IMD>
	<IMD>
		<element>
			<value>F</value>
		</element>
		<element>
			<value>11</value>
		</element>
		<element>
			<value>Personal-Nr.</value>
			<value>7275</value>
		</element>
	</IMD>
	<MOA>
		<element>
			<value>203</value>
			<value>5.76</value>
		</element>
	</MOA>
	<RFF>
		<element>
			<value>AKV</value>
			<value>88241</value>
		</element>
	</RFF>
	<RFF>
		<element>
			<value>LI</value>
			<value>2</value>
		</element>
	</RFF>
	<TAX>
		<element>
			<value>7</value>
		</element>
		<element>
			<value>VAT</value>
		</element>
		<element>
			<value>0.00</value>
		</element>
		<element>
			<value>E</value>
		</element>
	</TAX>
	<MOA>
		<element>
			<value>124</value>
			<value>0.00</value>
		</element>
	</MOA>
	<NAD>
		<element>
			<value>BV</value>
		</element>
		<element>
			<value>TB-rb 123</value>
		</element>
	</NAD>
 <edifact>
The output should be a txt file, looks like that:

A1201 88240 CAR d Touring Edition bt-ax 303 7200 Müller, Thomas
A130 381.95 19.00 72.57
A1202 88241 CAR d Coupe Edition TB-rb 123 7275 Burros, Thomas
A130 5.76 0 0




DEFINITIONS
A120 A130 are constant values for every object
1 2 LIN/element/value
88240 88241 RFF/element/value(two RFF`s identifier is 'AKV')
CAR CAR IMD/element[position()=3]/value
d Touring Edition d Coupe Edition IMD/element[position()=3]/value
bt-ax 303 TB-rb 123 NAD/element[position()=2]/value
7200 TB-rb 123 IMD/element[position()=3]/value[position()=2]
Müller, Thomas Burros, Thomas IMD/element[position()=3]/value[position()=2]
381.95 5.76 MOA/element/value[position()=2]
19.00 0 TAX/element[position()=3]/value
72.57 0 MOA/element/value[position()=2]

My problems are the following:
- order(sequence)
- multiple elementnames (the identifier is the first value the second value is the actual value examples: RFF-AKV, MOA-124, NAD-BV
- loops LIN-1, LIN-2, LIN-x

I have tried a lot, but i don't know how to solve this. The original file is much larger.

Maybe someone has a clue for me to find out the solution.

Last edited by pAperBlaze; September 6th, 2013 at 07:50 AM..
 
Old September 5th, 2013, 11:46 AM
mhkay's Avatar
Wrox Author
 
Join Date: Apr 2004
Posts: 4,962
Thanks: 0
Thanked 292 Times in 287 Posts
Default

First, reduce the document to a size that we can read on the screen. We don't have time to study something this detailed.

Second, show your best attempt to solve the problem. Then we can see where you are hitting difficulties: we can judge where you are on the learning curve and help you to get over the next obstacle.
__________________
Michael Kay
http://www.saxonica.com/
Author, XSLT 2.0 and XPath 2.0 Programmer\'s Reference
 
Old September 6th, 2013, 04:20 AM
Registered User
 
Join Date: Sep 2013
Posts: 7
Thanks: 1
Thanked 0 Times in 0 Posts
Default small example

Sorry you are right.

Another small example:
my XML

Code:
<?xml version="1.0" encoding="UTF-8"?>
<header>
	<A>
		<element>
			<value>100</value>
			<value>message</value>
		</element>
	</A>
	<B>
		<element>
			<value>10</value>
			<value>test</value>
		</element>
	</B>
	<A>
		<element>
			<value>101</value>
			<value>type</value>
		</element>
	</A>
	<B>
		<element>
			<value>20</value>
			<value>phase</value>
		</element>
	</B>
	<A>
		<element>
			<value>101</value>
			<value>type</value>
		</element>
	</A>
</header>
In this case my txt file should look like that:

typephase type
and so on.

My XSL-file looks like that:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" indent="yes" />
<xsl:template match="/">
<xsl:for-each select="header/descendant::node()">
<xsl:text> </xsl:text>
<xsl:if test="element/value='101'">
<xsl:value-of select="element/value[position()=2]"/>
</xsl:if>
<xsl:if test="element/value='20'">
<xsl:value-of select="element/value[position()=2]"/>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
The result is correctly but with the xsl file i only check the first values not the tags A, B and so on. If B`s first value would be 100, than my result would be false. testtypephase type
 
Old September 6th, 2013, 07:40 AM
Registered User
 
Join Date: Sep 2013
Posts: 7
Thanks: 1
Thanked 0 Times in 0 Posts
Default Another problem

Now i have a solution but i think this is not perfect.
Code:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" indent="yes" />
<xsl:template match="/">
<xsl:for-each select="header/descendant::node()">
<xsl:if test="name(.) = 'A' and element/value='101'">
<xsl:value-of select="element/value[position()=2]"/>
</xsl:if>
<xsl:if test="name(.) = 'B' and element/value='20'">
<xsl:value-of select="element/value[position()=2]"/>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
This stylesheet works fine, but my new problem is in xsl:for-each i want to define a order. The txt output is in the order of the xml file, but i want the order according to my queries. What do you think about the stylesheet and do you know how to solve my problem?
 
Old September 9th, 2013, 08:42 AM
Registered User
 
Join Date: Sep 2013
Posts: 7
Thanks: 1
Thanked 0 Times in 0 Posts
Default sadly

It's a pity that no one can give me a tip or maybe is my question is incomprehensible?
 
Old September 9th, 2013, 08:56 AM
Friend of Wrox
 
Join Date: Nov 2007
Posts: 1,243
Thanks: 0
Thanked 245 Times in 244 Posts
Default

Your posted XSLT is not indented so at least for me it is hard to read and understand what the code does.
Code like
test="name(.) = 'A'"
suggests to me that more XSLT like processing would use
Code:
<xsl:template match="A">...</xsl:template>
instead. Template based XSLT is in my view an important step to create maintainable XSLT.
__________________
Martin Honnen
Microsoft MVP (XML, Data Platform Development) 2005/04 - 2013/03
My blog
The Following User Says Thank You to Martin Honnen For This Useful Post:
pAperBlaze (September 9th, 2013)
 
Old September 9th, 2013, 09:18 AM
mhkay's Avatar
Wrox Author
 
Join Date: Apr 2004
Posts: 4,962
Thanks: 0
Thanked 292 Times in 287 Posts
Default

The question isn't incomprehensible - I've seen a lot worse - but it takes too long for the typical reader to work out what your problem is. It doesn't help that you seem to ask several questions and that you've changed the information as the thread progresses. So for busy people who have a choice, there's nothing here that encourages them to linger and work out what you are asking for.
__________________
Michael Kay
http://www.saxonica.com/
Author, XSLT 2.0 and XPath 2.0 Programmer\'s Reference
 
Old September 9th, 2013, 09:32 AM
samjudson's Avatar
Friend of Wrox
 
Join Date: Aug 2007
Posts: 2,128
Thanks: 1
Thanked 189 Times in 188 Posts
Default

Or even

Code:
<xsl:template match="A[element/value[1]='101']">
...
</xsl:template>
__________________
/- Sam Judson : Wrox Technical Editor -/

Think before you post: What have you tried?
 
Old September 9th, 2013, 09:48 AM
Registered User
 
Join Date: Sep 2013
Posts: 7
Thanks: 1
Thanked 0 Times in 0 Posts
Default understood

Okay now i understand it. I will rewrite my stylesheet and open a new thread with a precise question to my problem. Thank you very much.





Similar Threads
Thread Thread Starter Forum Replies Last Post
Extracting multiple elements from multiple files Daedalus XSLT 2 October 10th, 2012 10:31 AM
N Level elements in single table sophia ASP.NET 4 General Discussion 6 December 14th, 2011 10:12 AM
<a> element in within block-level elements? steddie1 BOOK: Beginning Web Programming with HTML, XHTML, and CSS, 2nd Edition ISBN: 978-0-470-25931-3 2 March 3rd, 2009 04:43 AM
How to get data from top level elements hubba09 XSLT 1 July 6th, 2007 07:49 AM
Grouping in XSLT at same level of hierarchy... concen XSLT 2 April 6th, 2006 10:12 AM





Powered by vBulletin®
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Copyright (c) 2020 John Wiley & Sons, Inc.