Subject: [xsl] Wrapping nodes outside tables into paragraphs From: "Martynas Jusevičius martynas@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Thu, 22 May 2014 19:18:55 -0000 |
Hey all, I have TEI markup where nodes (text nodes and some elements) are interspersed with table and figure elements, like this: <note> text text <ref type="whatever">text</ref> <table>...</table> text text <figure>...</figure> text text <table>...</table> <table>...</table> text text </note> There can be nodes before, between, and after tables. I want to produce a corresponding XHTML while also wrapping all the nodes between tables into <p>, so they're on the same block-level (for simplicity, lets say <xhtml:img> is also block-level): <xhtml:div> <xhtml:p>text text <a href="whatever">text</a></xhtml:p> <xhtml:table>...</xhtml:table> <xhtml:p>text text</xhtml:p> <xhtml:img/> <xhtml:p>text text</xhtml:p> <xhtml:table>...</xhtml:table> <xhtml:table>...</xhtml:table> <xhtml:p>text text</xhtml:p> </xhtml:div> My approach for table only (code below) was to wrap all the nodes before the matched table (if there are any; and after any previous tables), and have a special case for the last table to grab the following nodes as well. It seemed to work, but after I discovered that <figure> also has to be treated as <table>, the code is becoming less and less flexible. I was wondering if there was a better way? <xsl:template match="tei:table" mode="xhtml"> ... </xsl:template> <xsl:template match="tei:note/node()[not(self::tei:table)]" mode="xhtml" priority="1"> <xsl:param name="wrap" select="false()" as="xs:boolean"/> <xsl:if test="$wrap"> <xsl:next-match/> </xsl:if> </xsl:template> <xsl:template match="tei:note/tei:table[preceding-sibling::node()[not(self::tei:table)][following-sibling::tei:table[1] is current()]]" mode="xhtml" priority="1"> <xhtml:p> <xsl:apply-templates select="preceding-sibling::node()[not(self::tei:table)][following-sibling::tei:table[1] is current()]" mode="#current"> <xsl:with-param name="wrap" select="true()"/> </xsl:apply-templates> </xhtml:p> <xsl:next-match/> <xsl:if test="following-sibling::node()[not(self::tei:table)][not(following-sibling::tei:table)][preceding-sibling::tei:table[1] is current()]"> <xhtml:p> <xsl:apply-templates select="following-sibling::node()[not(self::tei:table)][not(following-sibling::tei:table)][preceding-sibling::tei:table[1] is current()]" mode="#current"> <xsl:with-param name="wrap" select="true()"/> </xsl:apply-templates> </xhtml:p> </xsl:if> </xsl:template> Thanks. Martynas
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Condition "last" and forc, Jesper Tverskov jesp | Thread | Re: [xsl] Wrapping nodes outside ta, Graydon graydon@xxxx |
Re: [xsl] Condition "last" and forc, Jesper Tverskov jesp | Date | Re: [xsl] Wrapping nodes outside ta, Graydon graydon@xxxx |
Month |