xsl-list
[Top] [All Lists]

RE: Copy all elemnts but one, not working

2005-12-28 13:09:57
Michael,

Thank you so much for your help, I was able to get it working.  However,
I still have one question.  I am not grasping why imagedata,
imageobject, and mediaobject are not being stripped out of other
elements that have an apply-templates call.  My concern is that this
will cause images to not appear that actually should appear, in other
trees.  Below is the code that I ended up using.  Any explanation would
be very much appreciated, and again, thank you so much for your
assistance!

Micah

XML:
<SIGNATURES>
        <SIGNATURE SIGNATURE_ID="09009978800b4a44">
          <SIGNATURE_ID>09009978800b4a44</SIGNATURE_ID>
          <chapter>
            <title/>
            <para role="mcx-Paragraph">
              <mediaobject>
                <imageobject>
                  <imagedata contentdepth="0.9895833333333334in"
contentwidth="4.9375in"
                    fileref="AFELIX_-_SIGNATURE_3-1.png"/>
                </imageobject>
              </mediaobject>
            </para>
            <para role="mcx-Paragraph">FirstName M. LastName</para>
            <para role="mcx-Paragraph">Engineer</para>
            <para role="mcx-Paragraph">My Company</para>
          </chapter>
        </SIGNATURE>
      </SIGNATURES>


XSLT:
        <xsl:template match="SIGNATURE">
                <xsl:if test="./SIGNATURE_ID/text()">
                        <xsl:element name="section">
                                <xsl:attribute
name="role">signature</xsl:attribute>
                                        <xsl:choose>
                                                <xsl:when
test="$delivery_method = 'FULFILLMENT_ITEM_MAIL' ">
        
<xsl:apply-templates select="chapter/*"/>
                                                </xsl:when>
                                                <xsl:otherwise>
                                                        <xsl:copy-of
select="chapter/*"/>
                                                </xsl:otherwise>
                                        </xsl:choose>
                        </xsl:element>
                </xsl:if>
        </xsl:template>
        
        <xsl:template match="mediaobject"/>
        <xsl:template match="imageobject"/>
        <xsl:template match="imagedata"/>

-----Original Message-----
From: Haarman, Michael [mailto:mhaarman(_at_)ibsys(_dot_)com] 
Sent: Wednesday, December 28, 2005 12:44 PM
To: 'xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com'
Subject: RE: [xsl] Copy all elemnts but one, not working

From: Huerta, Micah

Great!  I'm glad to know that it is indeed possible.  Can you 
please elaborate on the invocation part?  Are you saying that 
instead of excluding an element, expressly include only 
wanted elements?  What would a sample select expression 


Micah,

xsl:copy-of performs a *deep* copy, including all descendant elements
and
attributes.  I believe that is the source of your confusion.  Your
original
template simply matched all first order children of chapter and copied
them
(the title and para elements) and their children and attributes.

Your problem (element exclusion) is a FAQ and the answer involves what
is
termed the identity transform:

http://www.dpawson.co.uk/xsl/sect2/identity.html#d5442e43

Other links on that page will help clarify what is going on.  I'm not
entirely clear what your output needs to be, but it seemed you wanted to
build a tree rooted on chapter and containing everything but the
*imagedata*
element.  To invoke the templates I provided to accomplish this, use an
apply-templates like this:

  <xsl:template match="/">
    <xsl:apply-templates select="/SIGNATURES/SIGNATURE/chapter"/>
  </xsl:template>

To collect everthing but the *imagedata* from your input, invoke the
identity transform like this:

  <xsl:template match="/">
    <xsl:apply-templates select="*"/>
  </xsl:template>


The second template provided in my original response simply matches
*imagedata* elements and ignores them.  Because its match is explicit,
it
supercedes the invocation of the identity transform which would
otherwise
match *imagedata* with the wildcard.

HTH,

Mike



Try a pair of templates like this:

  <xsl:template match="*">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates/>
    </xsl:copy> 
  </xsl:template>

  <xsl:template match="imagedata"/>


--~------------------------------------------------------------------
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>
--~--



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