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

Re: pulling child elements up to sibling level

Subject: Re: pulling child elements up to sibling level
From: David Carlisle <davidc@xxxxxxxxx>
Date: Fri, 23 May 2003 17:51:29 +0100
xsl up a level
  My target schema only allows lists and such as siblings of paragraphs, thus
  I need to transform the document into something like this:



This is what I use in the stylesheet for the mathml spec to pull inline
lists tables and stuff out for the utterly useless content model of an
html p.  Adjust the list of elements to taste.



<!-- NESTED PARAGRAPHAS -->

<!-- xmlspec, like most document formats other than html, allows
    block level elements in paragraphs. For hTML need to
    separately wrap each conecutive run of inline elements in <p>
    and leave block level elements outside the p.

   xmlspec.xsl has some code using disable-output-escaping to
   attempt to do this, but it doesn't really work, even with processors
   that support d-o-e. The original mathml stylesheet as used for
   mathml 1.01 had code to deal with this, but this is a more
   efficient implementation using the grouping technique using keys.
-->


<xsl:key name="pnodes" match="p/node()" 
                  use="generate-id((..|
                     (preceding-sibling::*|.)[
          self::eg
       or self::glist
       or self::olist
       or self::ulist
       or self::slist
       or self::orglist
       or self::table
       or self::issue
       or self::note
       or self::processing-instruction()
       or self::graphic[not(@role='inline')]
        ])[last()])"/>

<xsl:template match="p">
<xsl:variable name="p1">
<p>
        <xsl:if test="@id">
         <xsl:attribute name="id"><xsl:value-of
  select="translate(@id,'_','.')"/></xsl:attribute>
        </xsl:if>
 <xsl:if test="@role">
   <xsl:attribute name="class">
      <xsl:value-of select="@role"/>
   </xsl:attribute>
 </xsl:if>
 <xsl:apply-templates select="key('pnodes',generate-id(.))"/>
</p>
</xsl:variable>
<xsl:if test="key('pnodes',generate-id(.))/self::* or normalize-space($p1)">
  <xsl:copy-of select="$p1"/>
</xsl:if>
<xsl:for-each select="eg|glist|olist|ulist|slist|orglist|
                       table|issue|note|processing-instruction()|
                       graphic[not(@role='inline')]">
<xsl:apply-templates select="."/>
<xsl:variable name="p" select="key('pnodes',generate-id(.))[position() &gt; 1]"/>
 <xsl:if test="$p[self::* or normalize-space(.)]">
<p>
<xsl:apply-templates select="$p"/>
</p>
</xsl:if>
</xsl:for-each>
</xsl:template>


<!-- END OF NESTED PARAGRAPHAS -->


________________________________________________________________________
This e-mail has been scanned for all viruses by Star Internet. The
service is powered by MessageLabs. For more information on a proactive
anti-virus service working around the clock, around the globe, visit:
http://www.star.net.uk
________________________________________________________________________

 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.