This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: Comparing nodes minus one child



Thank you for this help.  It has been very handy.  Now I was wondering I
could get some help on expanding this problem.

Assume that I have two collections of elements <A>(stored in variables)
that I have gotten from two different files.
The collections look something like the following
<HOLDER>
     <A>
          <B>..</B>
          <C>..</C>
          ...
          <X>..</X>
     </A>
</HOLDER>

I want to see if each of the <A> elements in the <HOLDER>(from first
collection) equals an <A> in the <HOLDER>(from the second collection), but
I want the comparison to only include the <A> with all of its children
EXCEPT the <X> element.
My goal is to output the entire <A> element (including the <X> element).

I can get rid of the <X> elements by calling the following templates:
<xsl:template match="node()|@*" mode="remove">
     <xsl:copy>
          <xsl:apply-templates select="node()|@*" mode="remove"/>
     </xsl:copy>
</xsl:template>
<xsl:template match="X"mode="remove">
     <!-- do nothing, we don't want this element in the result -->
</xsl:template>

I know that I can convert each set of <A> elements in both collections to
the compressed version.  Then I would have to iterate through all of the
original <A> elements, compressing that individually, and then comparing it
to the results of the compress second collection. (I also need to do it
going through the second list as well, since I am doing Adds, Deletes,
etc.).  Is there a way to do this more effiently?

Thanks again for your help.
     Matt Youngblut




                                                                                                                   
                    Wendell Piez                                                                                   
                    <wapiez@mulberr      To:     xsl-list@lists.mulberrytech.com                                   
                    ytech.com>           cc:     (bcc: Matthew J. Youngblut/US-Corporate/3M/US)                    
                                         Subject:     Re: [xsl] Comparing nodes minus one child                    
                    09/25/2001                                                                                     
                    03:36 PM                                                                                       
                    Please respond                                                                                 
                    to xsl-list                                                                                    
                                                                                                                   
                                                                                                                   





Matt:

I assume by "compare" you mean compare their string values. Comparing node
identity is not really practical in XSLT 1.0, nor even called for here.

At 03:37 PM 9/25/01, you wrote:
>     If I have two elements that have the same structure in two
>variables(today_product and yesterday_product):
>      <Product>
>           <Child1>...</Child1>
>           <Child2>...</Child2>
>           ...
>           <ChildX>...</ChildX>
>      </Product>
>
>How can I compare the two <Product> elements by comparing everything but
><ChildX> to see if they are equal?  If possible, I would like to do this
in
>one line as opposed to comparing each part, which I can already do.

You can do it in one line, if you set up some other lines to support your
one-line comparison.... I hope that's good enough.

Basically the trick is to use a mode to load variables with the values you
want; then compare the variables.

For example, you could say

<xsl:variable name="prod-1-value">
   <xsl:apply-templates select="$today-product" mode="product-compare"/>
</xsl:variable>

<xsl:variable name="prod-2-value">
   <xsl:apply-templates select="$yesterday-product" mode
="product-compare"/>
</xsl:variable>

(Note this will only work if $today-product and $yesterday-product are
actually nodes, not RTFs.)

Then have a separate template to say

<xsl:template match="ChildX" mode="product-compare"/>

which will remove the ChildX node from the RTFs created for the variables.
(The others will be included by default.)

Comparing the prod-1-value and prod-2-value RTFs will work as a string
comparison.

If plain string comparison isn't strong enough, you could provide the
strings with pseudo-markup by doing something like

<xsl:template match="*" mode="product-compare">
   <xsl:value-of select="concat('[', local-name(), ']')"/>
   <xsl:apply-templates mode="product-compare"/>
</xsl:template>

which will prefix each element's value with a "tag" (thus making your
string comparison more robust).

If you're curious (and can't already see it in your head), dump the
variables out to look at them before you compare them.

>i.e.  today_product (minus ChildX) ?= yesterday_product (minus ChildX)

I hope that helps.

Cheers,
Wendell



======================================================================
Wendell Piez                            mailto:wapiez@mulberrytech.com
Mulberry Technologies, Inc.                http://www.mulberrytech.com
17 West Jefferson Street                    Direct Phone: 301/315-9635
Suite 207                                          Phone: 301/315-9631
Rockville, MD  20850                                 Fax: 301/315-8285
----------------------------------------------------------------------
   Mulberry Technologies: A Consultancy Specializing in SGML and XML
======================================================================


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






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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]