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 |