| Subject: Re: [xsl] Transforming XML Blockquotes - Mixed Content - XSLT  1.0 Solution From: JBryant@xxxxxxxxx Date: Wed, 27 Apr 2005 15:22:40 -0500 | 
Hi, Edward,
In a nutshell, p[not(preceding-sibling::*[1]/self::p)] says, "the p whose 
first preceding sibling is not a p". I used it to find the start of each 
group of paragraphs that should be grouped together.
You can get the num value into the resulting p blocks by changing this 
section:
    <p>
      <xsl:for-each select="../p[@group=$group]">
        <xsl:apply-templates/>
      </xsl:for-each>
    </p>
to this:
    <p num="{@num}">
      <xsl:for-each select="../p[@group=$group]">
        <xsl:apply-templates/>
      </xsl:for-each>
    </p>
I apologize for the oversight. In tangling with the grouping problem I 
forgot that you needed the num attribute to come through.
In a larger stylesheet meant to solve real problems (rather than the tiny 
snippet we have here), you could insert the method of handling blockquotes 
into a choose statement:
<xsl:template match="p">
  <xsl:choose>
    <xsl:when test="blockquote">
      <!-- Process the paragraph to handle the blockquote -->
    </xsl:when>
    <xsl:otherwise>
      <!-- Process the paragraph the usual, more simple, way -->
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>
However, You'll still be checking each paragraph for the presence of a 
blockquote. However, any tool must do the same, yes? If any paragraph can 
contain a blockquote, doesn't the processing tool have to check every 
paragraph for the presence of a blockquote? So, some problems require this 
kind of processing. Of course, you could change the XML source to not have 
the root problem, but I assumed that was out of bounds.
Jay Bryant
Bryant Communication Services
(presently consulting at Synergistic Solution Technologies)
"Edward Bryant" <bryant_edward@xxxxxxxxxxx> 
04/27/2005 02:56 PM
Please respond to
xsl-list@xxxxxxxxxxxxxxxxxxxxxx
To
xsl-list@xxxxxxxxxxxxxxxxxxxxxx
cc
Subject
Re: [xsl] Transforming XML Blockquotes - Mixed Content - XSLT 1.0 Solution
Hello again,
Reply to David Carlisle and Wendell:
To the comments that I might try to use divs instead of the standard XHTML 
blockquote tag (because XHTML allows nested divs), I tried it and it 
doesn't 
work. If I remember correctly nested divs technically work but in IE6 a 
paragraph's initial indent is re-applied to the text following a 
blockquote 
(so, the continued part of the paragraph falsely appears to be a new 
paragraph). Hence, while some style features, such as line-height inherit 
correctly to the post blockquote text, it also incorrectly inherits the 
paragraph's initial indent.
Reply to David Carlisle and Michael Kay:
Thanks for David's explanation of why not to use DOE, as well as the 
tree-based reasoning behind XSLT (I understand why this kind of thing is a 
problem better). On the responses to my comment that Jay's solution was 
"overly complex", I did not mean that the offered solution was complex in 
that there were too many lines of code. What I meant was that the solution 
ends up handling or touching on a lot of data that isn't even involved in 
the blockquote problem. It is complex in that it results in a lot of extra 
processing of data, as in the example of a 20 page document with only one 
blockquote in one paragraph or the processing of documents without any 
blockquotes, etc.
Reply to Jay Bryant:
Thanks for your patience and your posting of a 1.0 compliant version of 
your 
solution. I did, however, have a few questions:
1. I tried to decipher this XPATH expression but I can't seem to 
understand 
it, can someone help explain what this is doing
         p[not(preceding-sibling::*[1]/self::p)]
2. In the below stylesheet (the second of the two you offered), how do you 
differentiate between the p representing the initial paragraph and the 
continued paragraph p tags. I need to figure out a way to output the 
original paragraph's "num" attribute next to the start of each real 
paragraph (but not repeat it for the new p tags surrounding the continued 
paragraph text).
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="x">
  <html>
  <head>
  <title>Paragraph Chunking Test</title>
  <link rel="stylesheet" type="text/css" href="style.css" />
  </head>
  <body>
    <xsl:for-each select="p[not(preceding-sibling::*[1]/self::p)]">
    <xsl:variable name="group" select="@group"/>
    <p>
      <xsl:for-each select="../p[@group=$group]">
        <xsl:apply-templates/>
      </xsl:for-each>
    </p>
    <xsl:apply-templates select="following-sibling::blockquote"/>
    </xsl:for-each>
  </body>
  </html>
  </xsl:template>
  <xsl:template match="p"/>
  <xsl:template match="blockquote">
    <xsl:copy-of select="."/>
  </xsl:template>
  <xsl:template match="span">
    <xsl:copy-of select="."/>
  </xsl:template>
</xsl:stylesheet>
| Current Thread | 
|---|
| 
 | 
| <- Previous | Index | Next -> | 
|---|---|---|
| Re: [xsl] Transforming XML Blockquo, Edward Bryant | Thread | [xsl] XML allowing variable XSL app, John | 
| Re: [xsl] I'm obviously doing somet, Deirdre Saoirse Moen | Date | Re: [xsl] Dimitre's Text Editor (wa, Dimitre Novatchev | 
| Month |