xsl-list
[Top] [All Lists]

Re: How to construct an XPath expression for this node-set?

2003-08-06 23:33:15
That's basically it. I ended up with just a straightforward XSL transformation instead of what I wanted -- the über-XPath expression that would magically return a nodeset of concatenated values. Since now it's just an XSL transform, I can get at the values pretty easily.

Thanks for your response,
Tim

On 2003.08.06 21:43, Mukul Gandhi wrote:
Hi Tim,
  i am guessing your XML file may look like --

<Addresses>
   <Address addressID="100">
     <Name xml:lang="en">90 - Test Name</Name>
   </Address>
   <Address addressID="101">
     <Name xml:lang="en">93 - B</Name>
   </Address>
   <Address addressID="100">
     <Name xml:lang="en">91 - Another Name</Name>
   </Address>
   <Address addressID="101">
     <Name xml:lang="en">92 - A</Name>
   </Address>
</Addresses>

You can use xsl:key to achieve the result .. Below is
the complete XSL --

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

<xsl:key name="x" match="/Addresses/Address"
use="@addressID"/>
<xsl:template match="Addresses">
  <xsl:variable name="addr" select="key('x','100')"/>


  <xsl:for-each select="xalan:nodeset($addr)">
    <xsl:value-of select="concat(@addressID, '-',
substring-before(Name, ' '))"/>
    <xsl:if test="position() != last()">
       <xsl:text>,</xsl:text>
    </xsl:if>
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

i am using Xalan nodeset extension to construct a
nodeset for a given addressID..

i guess this is what you want. You may modify the
specifics for your actual XML..

Regards,
Mukul


--- Tim Meals <tmeals(_at_)attbi(_dot_)com> wrote:
> I'm working with a problem I'd like to solve with a
> single XPath
> expression.  Yes, this is slightly off-topic, but
> I've seen some of the
> mind-boggling XPath expressions pass through this
> list and can't figure
> out how to do this one myself.
>
> The XML file excerpt is something like this:
> ...
> <Address addressID="100">
>     <Name xml:lang="en">90 - Test Name</Name>
>     ...
> </Address>
> ...
> <Address addressID="100">
>     <Name xml:lang="en">91 - Another Name</Name>
>     ...
> </Address>
>
> By definition, there are more than one Address
> element per XML file.
> Normally, there will be exactly two, but the spec
> allows the number to
> be open-ended.
>
> I would like to receive back a nodeset from the
> XPath expression, but
> concatenating the addressID with the
> substring-before(Name, ' ').  If I
> evaluate:
>     concat( //Address/@addressID, '-',
>             substring-before( //Address/Name, ' ' )
> )
> I get back a String with one value ("100-90", in
> this case).  What I
> want is a nodeset containing elements with "100-90",
> "100-91".  Does
> anyone have any ideas on how to procede?  I'm
> running Xalan 2.4.1, but
> could upgrade to 2.5.1 if there is functionality
> there that's not
> present in 2.4.1.
>
> Thanks,
> Tim
>
> --
> e-mail: tmeals(_at_)attbi(_dot_)com
>
> "Recommend to your children virtue; that alone can
> make them
>  happy, not gold."
>     -- Ludwig van Beethoven
>
>  XSL-List info and archive:
> http://www.mulberrytech.com/xsl/xsl-list
>


__________________________________
Do you Yahoo!?
Yahoo! SiteBuilder - Free, easy-to-use web site design software
http://sitebuilder.yahoo.com

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



<Prev in Thread] Current Thread [Next in Thread>