[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

RE: Searching in Sub-children from an Array

Subject: RE: Searching in Sub-children from an Array
From: "Houman Khorasani" <Houman.Khorasani@xxxxxxxxxxx>
Date: Thu, 7 Dec 2006 12:14:54 -0000
RE:  Searching in Sub-children from an Array
David,


I have a bit of a problem making this solution work properly: I have two
questions:

1) According to your suggestion, I have tried the following XSL

I have made a demo XML file for a better understanding of the problem:

<tree>
	<fruit ID="111">
		<mango ID="333">
			<color>Yellow</color>
		</mango>
		<orange ID="222">
			<color>orange</color>
		</orange>
	</fruit>
	<fruit_adjustment>
		<color>green</color>
		<Steps>111,333</Steps>
	</fruit_adjustment>
</tree>


The idea is to check <Steps> and see which fruit needs a new color. In
this example it is the mango; Its color should be adjusted to Green.
The expected output should be

<tree>
	<fruit ID="111">
		<mango ID="333">
			<color>green</color>
		</mango>
		<orange ID="222">
			<color>orange</color>
		</orange>
	</fruit>
</tree>

How do I have to proceed? I have tried this XSL below just to get an
idea, however instead I get this output:
<?xml version="1.0" encoding="utf-8"?>Yelloworangegreen

Which doesn't give me any clue...


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

	<xsl:key name="ids" match="*" use="@ID"/>

	<xsl:template match="Steps">
		<xsl:variable name="ids" select="tokenize(.,',\s*')"/>
		<xsl:apply-templates mode="step"
select="key('ids',$ids[1])[1]">
			<xsl:with-param name="ids"
select="$ids[position()!=1]"/>
		</xsl:apply-templates>
	</xsl:template>

	<xsl:template mode="step" match="*">
		<xsl:param name="ids"/>
		<xsl:apply-templates mode="step"
select="key('ids',$ids[1],.)[1]">
			<xsl:with-param name="ids"
select="$ids[position()!=1]"/>
		</xsl:apply-templates>
	</xsl:template>
</xsl:stylesheet>



2) I don't know if the thing above is possible at all, but even if so,
XML Mapping seems to be a bit slow, so I though as an alternative
solution, I could produce the <Steps> with a proper XPATH like this:

<tree>
	<fruit ID="111">
		<mango ID="333">
			<color>Yellow</color>
		</mango>
		<orange ID="222">
			<color>orange</color>
		</orange>
	</fruit>
	<fruit_adjustment>
		<color>green</color>
		<Steps>//*[@ID='111']//*[@ID='333']</Steps>
	</fruit_adjustment>
</tree>

Would I be then able to copy the <fruit> element and all its children
over and find only the fruit that needs a color change (according to the
XPath in <Steps>) and apply the color change?


Many Thanks,
Houman

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2007 All Rights Reserved.