Google Answers Logo
View Question
 
Q: Xpath: ancestor to view all parents of search? ( No Answer,   12 Comments )
Question  
Subject: Xpath: ancestor to view all parents of search?
Category: Computers > Programming
Asked by: kennethwsmith-ga
List Price: $5.00
Posted: 03 Jan 2005 06:55 PST
Expires: 28 Jan 2005 10:48 PST
Question ID: 450922
I have the following XML:

<?xml version='1.0' encoding='utf-8' ?>
<Locations>
    <Location name='A'>
        <Vehicles>
            <Vehicle vin='1'>
                <type>Car</type>
                <color>Red</color>
            </Vehicle>
            <Vehicle vin='2'>
                <type>Car</type>
                <color>Blue</color>
            </Vehicle>
            <Vehicle vin='3'>
                <type>Boat</type>
                <color>Red</color>
            </Vehicle>
            <Vehicle vin='4'>
                <type>Boat</type>
                <color>Green</color>
            </Vehicle>
            <Vehicle>
                <type>Boat</type>
                <color>Yellow</color>
            </Vehicle>
        </Vehicles>
    </Location>
    <Location name='B'>
        <Vehicles>
            <Vehicle vin='5'>
                <type>Car</type>
                <color>Orange</color>
            </Vehicle>
        </Vehicles>
    </Location>    
</Locations>

The following query gives me all of the vehicles of type 'Car':

//Vehicle[type='Car']

<Vehicle vin='1'>
    <type>Car</type>
    <color>Red</color>
</Vehicle>
<Vehicle vin='2'>
    <type>Car</type>
    <color>Blue</color>
</Vehicle>
<Vehicle vin='5'>
    <type>Car</type>
    <color>Orange</color>
</Vehicle>

But I want to be able to return the following:

<?xml version='1.0' encoding='utf-8' ?>
<Locations>
    <Location name='A'>
        <Vehicles>
            <Vehicle vin='1'>
                <type>Car</type>
                <color>Red</color>
            </Vehicle>
            <Vehicle vin='2'>
                <type>Car</type>
                <color>Blue</color>
            </Vehicle>
        </Vehicles>
    </Location>
    <Location name='B'>
        <Vehicles>
            <Vehicle vin='5'>
                <type>Car</type>
                <color>Orange</color>
            </Vehicle>
        </Vehicles>
    </Location>    
</Locations>

Notice that the Boats are not in this XML.

Thanks, I have tried all kinds of things, and can't figure it out.  I
am using Cold Fusion XmlSearch() which accepts all Xpath
functionality.  No .net or VB please!
Answer  
There is no answer at this time.

Comments  
Subject: Re: Xpath: ancestor to view all parents of search?
From: vladimir-ga on 03 Jan 2005 07:08 PST
 
Does this query give the results you want?

//Vehicle[type='Car']/ancestor-or-self::*

Vladimir
Subject: Re: Xpath: ancestor to view all parents of search?
From: kennethwsmith-ga on 03 Jan 2005 07:26 PST
 
No, that still returns the Boats, which I don't want in there.

Thanks!
Subject: Re: Xpath: ancestor to view all parents of search?
From: kennethwsmith-ga on 03 Jan 2005 08:19 PST
 
Looks to me now that I need to use xsl to transform the data that I
want to return.  Does this sound right?
Subject: Re: Xpath: ancestor to view all parents of search?
From: vladimir-ga on 03 Jan 2005 08:23 PST
 
Umm, yeah, now that I think of it you're probably right.

Vladimir
Subject: Re: Xpath: ancestor to view all parents of search?
From: kennethwsmith-ga on 03 Jan 2005 10:18 PST
 
anyone know how to do this?  This is super time-sensitive, so we are
trying all avenues to get this done.
Subject: Re: Xpath: ancestor to view all parents of search?
From: kennethwsmith-ga on 03 Jan 2005 12:41 PST
 
We are writing a work around, so this is not needed any longer.  Thanks.
Subject: Re: Xpath: ancestor to view all parents of search?
From: vladimir-ga on 03 Jan 2005 12:57 PST
 
I'm not an XSLT expert, but something like this seems to do what you need.

It could probably be written much cleaner.

Vladimir

<?xml version="1.0" encoding="iso-8859-2" ?>
<xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                                                                                
<xsl:template match="Vehicle[type='Car']">
        <xsl:copy-of select="."/>
</xsl:template>
                                                                                
<xsl:template match="*">
        <xsl:if test="descendant::Vehicle[type='Car']">
                <xsl:call-template name="acopyof"/>
        </xsl:if>
</xsl:template>
                                                                                
<xsl:template name="acopyof">
        <xsl:copy>
                <xsl:for-each select="@*">
                        <xsl:copy/>
                </xsl:for-each>
                <xsl:apply-templates/>
        </xsl:copy>
</xsl:template>
                                                                                
</xsl:stylesheet>
Subject: Re: Xpath: ancestor to view all parents of search?
From: kennethwsmith-ga on 04 Jan 2005 06:46 PST
 
Thats great!  One small clarification, and I will award the answer.

With a LocationStreet in the xml: 

<?xml version='1.0' encoding='utf-8' ?>
<Locations>
	<Location name='A'>
		<LocationStreet>123 Main Street</LocationStreet>
		<Vehicles>
			<Vehicle vin='1'>
				<type>Car</type>
				<color>Red</color>
			</Vehicle>
			<Vehicle vin='2'>
				<type>Car</type>
				<color>Blue</color>
			</Vehicle>
			<Vehicle vin='3'>
				<type>Boat</type>
				<color>Red</color>
			</Vehicle>
			<Vehicle vin='4'>
				<type>Boat</type>
				<color>Green</color>
			</Vehicle>
			<Vehicle>
				<type>Boat</type>
				<color>Yellow</color>
			</Vehicle>
		</Vehicles>
	</Location>
	<Location name='B'>
		<LocationStreet>423 Elm Drive</LocationStreet>
		<Vehicles>
			<Vehicle vin='5'>
				<type>Car</type>
				<color>Orange</color>
			</Vehicle>
		</Vehicles>
	</Location>	
</Locations>

The LocationStreet does not show up.  How can I get that to show up in the xml?
Subject: Re: Xpath: ancestor to view all parents of search?
From: vladimir-ga on 04 Jan 2005 07:19 PST
 
Well, it can be achieved in a number of ways I guess. If what you
really mean is "copy the entire XML tree filtering out the vehicles
that are not cars" then you can use a stylesheet like the one below.
It seems more elegant than listing every element that you want to copy
(like LocationStreet etc.).

Vladimir

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

<xsl:template match="Vehicle[type!='Car']">
</xsl:template>

<xsl:template match="*">
        <xsl:call-template name="acopyof"/>
</xsl:template>

<xsl:template name="acopyof">
        <xsl:copy>
                <xsl:for-each select="@*">
                        <xsl:copy/>
                </xsl:for-each>
                <xsl:apply-templates/>
        </xsl:copy>
</xsl:template>

</xsl:stylesheet>
Subject: Re: Xpath: ancestor to view all parents of search?
From: kennethwsmith-ga on 04 Jan 2005 07:41 PST
 
You are awesome!  Can you help me negate (?) this string?

//Tourcode[Code='AAO' or Code='ALH']/HotelList/Hotel[HotelCode='ABC']/HotelCode

I changed it to this:

//Tourcode[Code!='AAO' and Code!='ALH']/HotelList/Hotel[HotelCode!='ABC']/HotelCode

but it is not giving me what I am looking for.
Subject: Re: Xpath: ancestor to view all parents of search?
From: vladimir-ga on 04 Jan 2005 07:51 PST
 
Can you give a sample of the XML and the expected results?

Vladimir
Subject: Re: Xpath: ancestor to view all parents of search?
From: vladimir-ga on 04 Jan 2005 08:16 PST
 
I'm not a Google Researcher, just an enthusiast of the Google Answers
service, so I can't post answers, just comments like the ones above.
So I guess this one's free, you can treat it as a New Year's gift. I
hope to one day become a Google Researcher, if you want to help me you
can e-mail answers-support@google.com and tell them that vladimir-ga
helped you when noone else could and that you think they should make
me a researcher. :)

Vladimir

Important Disclaimer: Answers and comments provided on Google Answers are general information, and are not intended to substitute for informed professional medical, psychiatric, psychological, tax, legal, investment, accounting, or other professional advice. Google does not endorse, and expressly disclaims liability for any product, manufacturer, distributor, service or service provider mentioned or any opinion expressed in answers or comments. Please read carefully the Google Answers Terms of Service.

If you feel that you have found inappropriate content, please let us know by emailing us at answers-support@google.com with the question ID listed above. Thank you.
Search Google Answers for
Google Answers  


Google Home - Answers FAQ - Terms of Service - Privacy Policy