Subject: [xsl] enclosing consecutive XHTML heading elements into <hgroup />, etc. From: Ivan Shmakov <oneingray@xxxxxxxxx> Date: Wed, 11 Sep 2013 09:18:34 +0000 |
Long story short: the input XML has spans of elements which are to be enclosed within elements of some other kind, as in: <!-- Input --> <doc> <a /><a /><b /><b /> <foo> <a /><b /><b /> <aa /><a /><b /> </foo> </doc> <!-- Output --> <doc> <enclosing> <a /><a /><b /><b /> <foo> <enclosing><a /><b /><b /></enclosing> <enclosing><aa /><a /><b /></enclosing> </foo> </enclosing> </doc> Is there a simple way to do that, given that the set of the elements which can start such a span is finite (<a /> and <aa /> in the example above), but they can otherwise occur anywhere? FWIW, Ibm constrained to XSLT 1.0. The overall task is to introduce <article />, <section />, <header />, and <hgroup /> elements, as per the following example. Input: <?xml version="1.0"?> <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>Hello, world!</title></head> <body> <h3>The well-known</h3> <h1>Hello, world!</h1> <h2>program</h2> <p>Here we discuss the generalsb&</p> <h2>J. R. Hackerbs implementation</h2> <p>And here are the particularsb&</p> </body> </html> Expected output: <?xml version="1.0"?> <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>Hello, world!</title></head> <body> <article> <header> <hgroup> <h3>The well-known</h3> <h1>Hello, world!</h1> <h2>program</h2> </hgroup> </header> <p>Here we discuss the generalsb&</p> <section> <header> <h2>J. R. Hackerbs implementation</h2> </header> <p>And here are the particularsb&</p> </section> </article> </body> </html> Or, algorithmically speaking: b" enclose the <body /> contents into an <article /> element, if therebs none; b" enclose uninterrupted sequences of two or more heading (<h1 /> to <h6 />) elements into <hgroup />s; b" enclose the resulting <hgroup />s and the (so far unprocessed) singular heading elements into <header />s; b" and finally, enclose all the <article /> elements starting with a <header /> element (including one) and stopping at the next <header /> (excluding one) into <section />s; the first <article />bs <header /> is to be excluded. My current implementation is at [1], and what makes me wonder is whether itbs possible to avoid a template like the following there: <xsl:template match="xhtml:h1[preceding-sibling::*[position () = 1][self::xhtml:h1 or self::xhtml:h2 or self::xhtml:h3 or self::xhtml:h4 or self::xhtml:h5 or self::xhtml:h6]] | xhtml:h2[preceding-sibling::*[position () = 1][self::xhtml:h1 or self::xhtml:h2 or self::xhtml:h3 or self::xhtml:h4 or self::xhtml:h5 or self::xhtml:h6]] | xhtml:h3[preceding-sibling::*[position () = 1][self::xhtml:h1 or self::xhtml:h2 or self::xhtml:h3 or self::xhtml:h4 or self::xhtml:h5 or self::xhtml:h6]] | xhtml:h4[preceding-sibling::*[position () = 1][self::xhtml:h1 or self::xhtml:h2 or self::xhtml:h3 or self::xhtml:h4 or self::xhtml:h5 or self::xhtml:h6]] | xhtml:h5[preceding-sibling::*[position () = 1][self::xhtml:h1 or self::xhtml:h2 or self::xhtml:h3 or self::xhtml:h4 or self::xhtml:h5 or self::xhtml:h6]] | xhtml:h6[preceding-sibling::*[position () = 1][self::xhtml:h1 or self::xhtml:h2 or self::xhtml:h3 or self::xhtml:h4 or self::xhtml:h5 or self::xhtml:h6]]" priority="2" > <!-- do nothing --> </xsl:template> TIA. [1] http://am-1.org/~ivan/src/cxw3i61gtnuc78sbufiftcgz5f.xsl -- FSF associate member #7257 http://sf-day.org/
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Specification of a transf, Wendell Piez | Thread | Re: [xsl] enclosing consecutive XHT, Wendell Piez |
Re: [xsl] Specification of a transf, Michael Kay | Date | Re: [xsl] Specification of a transf, Wendell Piez |
Month |