473,232 Members | 1,576 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,232 software developers and data experts.

Preceding with partial string

I seem to have a problem using the preceding:: on substrings of the
value. I'll try to explain with an example:

Let's say I had a XML that look like:

<Root>
<Row>
<Cell Name="Street" Value="2nd Street" />
</Row>
<Row>
<Cell Name="Street" Value="Meadow Lane" />
</Row>
<Row>
<Cell Name="Street" Value="2nd Street" />
</Row>
<Row>
<Cell Name="Street" Value="2nd Street" />
</Row>
<Row>
<Cell Name="Street" Value="Meadow Lane" />
</Row>

</Root>

Let's say I want to find the distinct streets. This is straight
forward and may look something like:
<xsl:template match="Root">
<xsl:element name="root">
<xsl:for-each select="./Row[Cell[@Name = 'Street' and not(@Value =
preceding::Cell[@Name= 'Street']/@Value) ]]">

<xsl:variable name="UniqueStreet" select="./Cell[@Name='Street']/
@Value"/>

<xsl:element name="street">
<xsl:attribute name="name">
<xsl:value-of select="$UniqueStreet"/>
</xsl:attribute>

<!-- This is where I would reiterate through the list to get the
list of residents
that live on that block -->
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>

This returns what I expect:

<root>
<street name="2nd Street"/>
<street name="Meadow Lane"/>
</root>

But let's say the address contained street numbers, and I needed to
strip out the street numbers when trying to look for unique street
names.
<Root>
<Row>
<Cell Name="Address" Value="1345 2nd Street" />
</Row>
<Row>
<Cell Name="Address" Value="332 Meadow Lane" />
</Row>
<Row>
<Cell Name="Address" Value="333 2nd Street" />
</Row>
<Row>
<Cell Name="Address" Value="8534 2nd Street" />
</Row>
<Row>
<Cell Name="Address" Value="556 Meadow Lane" />
</Row>

</Root>

<xsl:template match="Root">
<xsl:element name="root">
<xsl:for-each select="./Row[Cell[@Name = 'Address' and
not(substring-after(@Value, ' ') = substring-
after(preceding::Cell[@Name= 'Address']/@Value, ' ')) ]]">

<xsl:variable name="UniqueStreet" select="substring-after(./
Cell[@Name='Address']/@Value, ' ')"/>

<xsl:element name="street">
<xsl:attribute name="name"><xsl:value-of select="$UniqueStreet"/
></xsl:attribute>
<!-- This is where I would reiterate through the list to get the
list of residents
that live on that block -->
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>

This yields the output:

<root>
<street name="2nd Street"/>
<street name="Meadow Lane"/>
<street name="Meadow Lane"/>
</root>

Can someone explain why that is happening and how I can fix it?
Jun 27 '08 #1
1 2480
rn******@gmail.com wrote:
<xsl:for-each select="./Row[Cell[@Name = 'Street' and not(@Value =
preceding::Cell[@Name= 'Street']/@Value) ]]">
<xsl:for-each select="./Row[Cell[@Name = 'Address' and
not(substring-after(@Value, ' ') = substring-
after(preceding::Cell[@Name= 'Address']/@Value, ' ')) ]]">
Can someone explain why that is happening and how I can fix it?
The first comparison compares two node-sets (one with the single
attribute @Value, one with all @Value attributes of preceding::Cell
elements).
The second comparison however compares the single @Value attribute to
the string result of substring-after applied to the node-set of @Value
attributes of preceding::Cell elements and that way you only compare to
one preceding attribute, not to all.

With XSLT 2.0 you could use

<xsl:for-each select="./Row[Cell[@Name = 'Address' and
not(substring-after(@Value, ' ') = preceding::Cell[@Name=
'Address']/@Value/substring-after(., ' ')) ]]">

to make sure you compare to a sequence and not a string value but that
solution does not exist in XSLT 1.0.

And XSLT 2.0 has other (easier) ways to identify distinct values, there
is the function distinct-values
http://www.w3.org/TR/xpath-functions...istinct-values and there is
xsl:for-each-group.
With XSLT 1.0 you need to use Muenchian grouping:

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">

<xsl:key name="by-street"
match="Row"
use="substring-after(Cell[@Name = 'Address']/@Value, ' ')"/>

<xsl:template match="Root">
<root>
<xsl:for-each
select="Row[generate-id() = generate-id(key('by-street',
substring-after(Cell[@Name = 'Address']/@Value, ' '))[1])]">
<street>
<xsl:value-of select="substring-after(Cell[@Name =
'Address']/@Value, ' ')"/>
</street>
</xsl:for-each>
</root>
</xsl:template>

</xsl:stylesheet>
--

Martin Honnen
http://JavaScript.FAQTs.com/
Jun 27 '08 #2

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

2
by: Sven | last post by:
Hi I have the following XML & XSLT: XML: <?xml version="1.0" encoding="utf-8"?> <Source Source="IBM"> <Detail> <UserID></UserID>
16
by: pawel.pabich | last post by:
Hajo, I would like to have 2 my own partial classes. For example: Default.aspx.cs Default2.aspx.cs and they both will relate to Default.aspx page.
10
by: ptass | last post by:
Hi In asp.net 2.0 an aspx files .cs file is a partial class and all works fine, however, I thought Iā€™d be able to create another class file, call it a partial class and have that compile and...
1
by: chungiemo | last post by:
Hi thought I would do another thread as this one is a bit different from the previous problem I am looking for a solution to the relating problem Comparing 2 access databases with 2 tables,...
1
by: hardieca | last post by:
Hi! I decorate my unfinished classes and methods with a custom TODO attribute (as in things To Do). Using reflection, I am then able to parse through my classes and output all TODOs to a list I...
2
by: saengpole | last post by:
Hi all, I'm a newbie in VB2005. I have a trouble getting text from textbox and combobox.SelectedValue. The values reside on two controls are text. But they are in numeric text eg. product code...
4
by: Phil Barber | last post by:
I have two web pages in a VS 2005 project. the first page has a struct defined and used in the partial class: public partial class InterIndex : System.Web.UI.Page { public struct TXMLData {...
5
by: SAL | last post by:
Hello, I would like to be able to set the WHERE clause of a select statement on the fly. I have a DataAccess layer designed using the DataSet designer and a BusinessLogic layer using classes. The...
10
by: JDeats | last post by:
So I have a class that spans over two partial classes in code, here's an example (do not read much into this, the code is of no practical use, this is just a simple example of where my confusion...
3
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 3 Jan 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). For other local times, please check World Time Buddy In...
0
by: jianzs | last post by:
Introduction Cloud-native applications are conventionally identified as those designed and nurtured on cloud infrastructure. Such applications, rooted in cloud technologies, skillfully benefit from...
0
by: abbasky | last post by:
### Vandf component communication method one: data sharing ​ Vandf components can achieve data exchange through data sharing, state sharing, events, and other methods. Vandf's data exchange method...
2
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 7 Feb 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:30 (7.30PM). In this month's session, the creator of the excellent VBE...
0
by: fareedcanada | last post by:
Hello I am trying to split number on their count. suppose i have 121314151617 (12cnt) then number should be split like 12,13,14,15,16,17 and if 11314151617 (11cnt) then should be split like...
1
by: davi5007 | last post by:
Hi, Basically, I am trying to automate a field named TraceabilityNo into a web page from an access form. I've got the serial held in the variable strSearchString. How can I get this into the...
0
by: MeoLessi9 | last post by:
I have VirtualBox installed on Windows 11 and now I would like to install Kali on a virtual machine. However, on the official website, I see two options: "Installer images" and "Virtual machines"....
0
by: DolphinDB | last post by:
The formulas of 101 quantitative trading alphas used by WorldQuant were presented in the paper 101 Formulaic Alphas. However, some formulas are complex, leading to challenges in calculation. Take...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.