[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

RE: Complex Match Pattern

Subject: RE: Complex Match Pattern
From: "Dung, Ming-tzung" <Ming-tzung_Dung@xxxxxxxxxxxxx>
Date: Wed, 1 May 2002 16:41:13 -0600
xsl match pattern
Tom
   Thank you so much!!  It works!!
  

Ming-tzung Dung




-----Original Message-----
From: Thomas B. Passin [mailto:tpassin@xxxxxxxxxxxx]
Sent: Wednesday, May 01, 2002 3:33 PM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re:  Complex Match Pattern


[Dung, Ming-tzung]

>    The problem I have is about filtering and printing problem.
> **Input XML:
> <Difference>
>   <Object> A </Object>
>   <Change> change1 </Change>
>   <Chnage> change 2 </Change>
>    .....
> </Difference>
>   The requirement is to output the Object content and the "meaningful"
> change content. The "meaningful" change means the content won't contain
> certain value, such as "NULL" or "NONE".
>   The challenges is that if there are no any meaningful change, don't
output
> anything.
> Originally, I though that I can use the following code to solve the
problem
>
> <xsl:for-each select="Difference[not(contains(Change, 'NULL]') or
> contains(Change, 'NONE']'))]>
>    <xsl:if test="position()=1">
>        <!-- output the Object content -->
>    </xsl:if>
>        <!-- output the Change content -->
> </xsl:for-each>
>
>  BUT because the Change could have multiple lines, this design won't work.

If I understand you, if there are no changes you do not even want to output
"Object A".  Then I would probably approach it like this - the idea is to
build up the result of all the changes, then check to see if it actually
contains anything.  The details and possibly the exact form of the test
would depend on the form you want your output to take:

<!-- Inside some template -->
<xsl:apply-templates select='Difference'/>
<!--...-->
</xsl:template>

<xsl:template match='Difference'>
    <xsl:variable name='changes'>
        <xsl:apply-templates select='Change[text()!="NONE" and
text()!="NULL"]'/>
    </xsl:variable>

    <xsl:if test='$changes!=""'>Object <xsl:value-of select='Object'/>
     Changes: <xsl:value-of select='$changes'/></xsl:if><br/>
</xsl:template>

<xsl:template match='Change'>
 <xsl:value-of select='.'/>
</xsl:template>

You need to be careful about stray whitespace.  If you might have whitespace
before or after "NULL" or "NONE", you would need to apply
"normalize-space()" to them or the select path will not work correctly.  If
you want to put the change details into elements, the test might have to
change a little - I just made them all into a string for simplicity.

This stylesheet works right on the sample xml data I created for it, but I'm
sure you will want to adjust it somewhat to suit your needs.

Cheers,

Tom P


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

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


Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.