xsl-list
[Top] [All Lists]

Re: [xsl] Output common IDs

2011-01-29 22:42:34
Understand I was making it more complicated than it needs to be.

Thanks Brandon for your thorough explanation.

Suresh

On Wed, Jan 26, 2011 at 4:32 AM, Brandon Ibach
<brandon(_dot_)ibach(_at_)single-sourcing(_dot_)com> wrote:

You don't really need to save the result of the first tokenize() call
to a variable, but you do need to tokenize on '\n', rather than '\t+',
in order to get each line in turn.  You'll also need to save the value
of each item in the outer for-each so you can access it in the inner
for-each.

Using normalize-space() before passing $FilteredPageIds to tokenize()
will get rid of the "blank" results caused by newlines at the start
and end of the text inside the "id" element.  This change will also
pretty much eliminate the need for the $CurrentPageId variable.
Finally, add a newline after printing each match.

    <xsl:template match="/AllIds">
        <xsl:for-each select="tokenize(text(),'\n')">
           <xsl:variable name="CurrentId" select="current()"/>
            <xsl:for-each
select="tokenize(normalize-space($FilteredPageIds),' ')">
                <xsl:if test="current() =
substring-before(normalize-space($CurrentId),' ')">
                    <xsl:value-of select="concat($CurrentId,'&#10;')"/>
                </xsl:if>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:template>

Taking advantage of XSLT's abilities to match against sets and filter
the results of tokenize() with a predicate, we have the following
version.

   <xsl:template match="/AllIds">
       <xsl:variable name="PageIds"
select="tokenize(normalize-space($FilteredPageIds),' ')"/>
       <xsl:for-each
select="tokenize(text(),'\n')[substring-before(normalize-space(.),' ')
= $PageIds]">
           <xsl:value-of select="concat(.,'&#10;')"/>
       </xsl:for-each>
   </xsl:template>

-Brandon :)


On Wed, Jan 26, 2011 at 1:11 AM, Suresh 
<suresh(_dot_)chinta(_at_)gmail(_dot_)com> wrote:
Hi,

I have a xml file (PageIDs.xml) which contains several IDs. I have
another file which contains ID and URI separated by a tab(AllIDs.xml)

The question is, For each tokenized ID contained in PageIDs.xml file I
want to test all IDs in AllIDs.xml and if ID test matches output
matching line as text. This is simple for members in the list, I tried
but I could not solve this using XSLT 2.0

 PageIDs.xml
-------------------
<id>
BD6131A5-527C-11DF-A29F-00144F3EA4A4
DCA7D4CA-312D-11DF-A385-00144F3EA4A4
DD762167-312D-11DF-A385-00144F3EA4A4
DDB79742-312D-11DF-A385-00144F3EA4A4
3D74A11A-839A-11DF-82F6-00144F3EA4A4
...
</id>

AllIDs.xml
---------------
<AllIds>
DCA7D4CA-312D-11DF-A385-00144F3EA4A4    /accounts-overview/dkadoemfew
8ED29EEA-6460-11DF-8508-00144F3EA4A4    redirect.go?target=payxsxs
EC2152EB-4593-11DF-BCB6-00144F3EA4A4   
 /accounts-overview/redirect.go?target=feljfweij
997A1170-474A-11DF-BCB6-00144F3EA4A4    redirect.go?target=woqiepoqie
DD4AF2B0-312D-11DF-A385-00144F3EA4A4    /accounts-overview/e32i2je2
BD6131A5-527C-11DF-A29F-00144F3EA4A4    /contactus/about-contact
...
</AllIds>

This is the XSLT I've written...

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
   xmlns:xs="http://www.w3.org/2001/XMLSchema";
exclude-result-prefixes="xs" version="2.0">
   <xsl:output method="text"/>
   <xsl:variable name="FilteredPageIds" select="doc('pageIDs.xml')/id"/>

   <xsl:template match="/AllIds">
       <xsl:variable name="AllListedIds" select="tokenize(text(),'\t+')"/>
       <xsl:for-each select="$AllListedIds">
           <xsl:for-each select="tokenize($FilteredPageIds,'\n')">
               <xsl:variable name="CurrentPageId"
select="normalize-space(current())"/>
               <xsl:if test="contains($CurrentPageId, $AllListedIds)">
                   <xsl:value-of select="$AllListedIds"/>
               </xsl:if>
           </xsl:for-each>
       </xsl:for-each>
   </xsl:template>
</xsl:stylesheet>

This fails at contains because the item is a collection and I am not
sure how to handle them.

Expected output for IDs matching in PageIDs.xml,

BD6131A5-527C-11DF-A29F-00144F3EA4A4    /contactus/about-contact

Thanks.
--
Suresh

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--




--
Suresh

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

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