This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
RE: Extracting a list of unique base urls from anchors in a html docu ment.
- To: "'xsl-list at lists dot mulberrytech dot com'" <xsl-list at lists dot mulberrytech dot com>
- Subject: RE: [xsl] Extracting a list of unique base urls from anchors in a html docu ment.
- From: Taras Tielkes <taras at info dot nl>
- Date: Fri, 14 Sep 2001 13:53:46 +0200
- Reply-To: xsl-list at lists dot mulberrytech dot com
Hi David,
I adopted your earlier suggestion, and used a map:
<xsl:key name="local-links" match="a[contains(@href, '#') and
not(contains(@href, '/'))]" use="substring-before(@href,'#')"/>
The code that uses this map to extract information looks like:
Unique base-urls:
<xsl:for-each select="//a[generate-id() = generate-id(key('local-links',
substring-before(@href, '#'))[1])]">
href base: <xsl:value-of select="substring-before(@href, '#')"/>
occurances: <xsl:value-of select="count(key('local-links',
substring-before(@href, '#')))"/>
</xsl:for-each>
Can the code above be written in a more efficient way? I guess there isn't a
way to directly iterate over the keys in a map created by <xsl:key>?
By main question, however, is this: how can I aggregate this table of data
into an aggregated one, where every base url part maps to a count of
occurances of this base url part in the source document?
Thanks,
// tt
> -----Original Message-----
> From: David Carlisle [mailto:davidc@nag.co.uk]
> Sent: Thursday, September 13, 2001 8:06 PM
> To: xsl-list@lists.mulberrytech.com
> Subject: Re: [xsl] Extracting a list of unique base urls from
> anchors in
> a html docu ment.
>
>
>
> > I'm propably wrong,
>
> I'm afraid so:-)
>
> > The only difference is that my template doesn't compare the
> attribute values
> > as-is, but applies a substring before doing so.
>
> No the string function completely changes the sematics of =.
>
> If you have an XPath test of the form
>
> (node-set a) = (node-set b)
>
> then it is true if _any_ node in set a has a value equal to
> any node in
> set b.
>
> That's what you have here:
>
> @country=preceding-sibling::city/@country
>
> @country and preceding-sibling::city/@country
> both select node sets.
>
> If you have
>
> (string a) = (string b)
>
> then this is true if the string a equals to the string b.
>
> that's what you have here:
>
> substring-before(@href,'#')=substring-before(preceding::a/@href,'#')
>
> as substring-before always returns a string.
>
> substring-before requires a string as its first argument and
> if you give
> it a node set (as here) then it takes the string value of the
> first node
> (in document order) of the node set.
>
> @href has at most one node but preceding::a/@href has perhaps
> many node but
> whatever the current node the first node in that collection
> is the first
> href attribute on an a element that occurs in the document.
>
> David
>
> _____________________________________________________________________
> This message has been checked for all known viruses by Star Internet
> delivered through the MessageLabs Virus Scanning Service. For further
> information visit http://www.star.net.uk/stats.asp or
> alternatively call
> Star Internet for details on the Virus Scanning Service.
>
> XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
>
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list