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]
Other format: [Raw text]

RE: Complex Match Pattern


Tom
   Thank you so much!!  It works!!
  

Ming-tzung Dung




-----Original Message-----
From: Thomas B. Passin [mailto:tpassin@mitretek.org]
Sent: Wednesday, May 01, 2002 3:33 PM
To: xsl-list@lists.mulberrytech.com
Subject: Re: [xsl] 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


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