xsl-list
[Top] [All Lists]

Re: [xsl] Grouping by attribute

2009-10-22 09:55:28
What I didn't mention earlier is that the quote's can't have text
nodes right underneath themselves. All-in-all I have found this to
solve my problem (the last one mentioned anyway, not the one that
started the thread - but inspired by it):

        <xsl:template match="p">
                <xsl:for-each-group select="./node()" group-starting-with="p | 
quote
| illustration">
                        <xsl:choose>
                                <xsl:when test="(name(current-group()[1])='p') 
or
(name(current-group()[1])='quote'))">
                                        <xsl:apply-templates 
select="current-group()[1]"/>
                                        <p>
                                                <xsl:apply-templates 
select="current-group()[position()>1]"/>
                                        </p>
                                </xsl:when>
                                <xsl:otherwise>
                                        <p>
                                                <xsl:apply-templates 
select="current-group()"/>
                                        </p>
                                </xsl:otherwise>
                        </xsl:choose>
                </xsl:for-each-group>
        </xsl:template>

        <xsl:template match="quote">
                <quote>
                        <xsl:for-each-group select="./node()" 
group-starting-with="p">
                                <xsl:choose>
                                        <xsl:when 
test="name(current-group()[1])='p'">
                                                <xsl:apply-templates 
select="current-group()[1]"/>
                                                <p>
                                                        <xsl:apply-templates 
select="current-group()[position()>1]"/>
                                                </p>
                                        </xsl:when>
                                        <xsl:otherwise>
                                                <p>
                                                        <xsl:apply-templates 
select="current-group()"/>
                                                </p>
                                        </xsl:otherwise>
                                </xsl:choose>
                        </xsl:for-each-group>
                </quote>
        </xsl:template>

Which on the previously stated input gives:

<body>
        <!-- case 1 -->
        <p>text</p>
        
        <!-- case 2 -->
        <quote>
                <p>
                        text
                </p>
                <p>text</p>
                <p>
                        text
                        <span>text</span>
                </p>
        </quote>
        
        <!-- case 3 -->
        <quote>
                <p>
                        text
                 </p>
        </quote>
        <p/>
        
        <!-- case 4 -->
        <p>
                text
        </p>
        <quote>
                <p>text</p>
        </quote>
        <p>
                text
                <span>text</span>
                text
        </p>
</body>

Thanks for the help folks.
Jostein

2009/10/21 Jostein Austvik Jacobsen <josteinaj(_at_)gmail(_dot_)com>:
<quote> tags were occuring inside <p> tags, which they are not allowed
to do. Initially <quote> tags are the only thing I need to move out of
<p>. So:

<body>
 <!-- case 1 -->
 <p>text<p>

 <!-- case 2 -->
 <quote>
   text
   <p>text</p>
   text
   <span>text</span>
 </quote>

 <!-- case 3 -->

 <p><quote>text</quote></p>

 <!-- case 4 -->

 <p>
   text
   <quote>text</quote>
   text
   <span>text</quote>
   text
 </p>
</body>

should become:

<body>
 <!-- case #1 -->
 <p>text</p>

 <!-- case #2 -->
 <quote>
   text
   <p>text</p>
   text
   <span>text</span>
 </quote>

 <!-- case #3 -->
 <quote>text</quote>

 <!-- case #4 result #1 -->

 <p>text</p>
 <quote>text</quote>
 <p>
   text
   <span>text</span>
   text
 </p>
</body>

I'm not sure if the last p actually turns into three p's:

 <!-- case #4 result #2 -->
 <p>text</p>
 <p><span>text</span></p>
 <p>text</p>

Result #1 would be best, but result #2 this is also acceptable. I'll
check tomorrow what is actually happening. In any case, it validates
against the DTD used and the result is working as expected.

-Jostein

2009/10/21 Wendell Piez <wapiez(_at_)mulberrytech(_dot_)com>

Jostein,

At 08:33 AM 10/21/2009, you wrote:

Nice. I modified it slightly for the more complex structure of the
actual XML, but you essentially solved it.

But ... as so often, the problem as specified is just the tip of what could 
be a much larger iceberg.

What if your data has

<p>
 text <span>more text</text> text
 <quote>text</quote>
 text
 <quote>text</quote>
 text
</p>

What do you want to happen then?

By generating p elements only when you match "text()[parent::p]" (or, 
equivalently, "p/text()"), you succeed in splitting out all the text node 
children of p from their sibling elements. But your problem specification 
didn't actually say this was what you wanted to do -- and the problem of 
splitting only some of the elements is at least as common.

For that problem, you do in fact want to use grouping. (And I think it came 
up quite recently on the list).

Cheers,
Wendell



======================================================================
Wendell Piez                           
 mailto:wapiez(_at_)mulberrytech(_dot_)com
Mulberry Technologies, Inc.                http://www.mulberrytech.com
17 West Jefferson Street                    Direct Phone: 301/315-9635
Suite 207                                          Phone: 301/315-9631
Rockville, MD  20850                                 Fax: 301/315-8285
----------------------------------------------------------------------
 Mulberry Technologies: A Consultancy Specializing in SGML and XML
======================================================================


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