|
Subject: [xsl] Getting text and non-block nodes before any block nodes From: "Eliot Kimber ekimber@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Fri, 12 Sep 2014 21:50:20 -0000 |
I think this is an FAQ but my situation may be slightly different. In any
case, if it's an FAQ, maybe my asking it will help.
This is in a DITA context, where I can know for any element whether it is
a block or not a block (because in DITA all elements have a base type that
is inherently block or not block).
I have the situation where a wrapper element may contain any combination
of text, non-block elements, or block elements.
I need to find either all the nodes up to the first block or determine
that there are none and get the first block.
My solution is:
<xsl:variable name="textBeforeBlocks">
<xsl:sequence select="(text() |
*[not(lc:isBlock(.))])[not(preceding-sibling::*[lc:isBlock(.)])]"/>
</xsl:variable>
<xsl:variable name="hasTextBeforeBlocks" as="xs:boolean"
select="normalize-space(string($textBeforeBlocks)) != ''"
/>
Where the lc:isBlock() function returns true if the element provided is a
DITA block element.
This seems to pass all my tests but I'm wondering if there's a better way
to make this check?
I also realized that I can use the $textBeforeBlocks variable to then
process any remaining blocks (because I will have already output the text
before blocks):
<xsl:when test="$hasTextBeforeBlocks">
<xsl:apply-templates select="node() except($textBeforeBlocks)"/>
</xsl:when>
Which I think is a particularly nice example of using "except".
Thanks,
Eliot
bbbbb
Eliot Kimber, Owner
Contrext, LLC
http://contrext.com
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] process xslt and xml spre, Wendell Piez wapiez@ | Thread | Re: [xsl] Getting text and non-bloc, G. Ken Holman g.ken. |
| Re: [xsl] XSLT vs Web Components, Matthew L. Avizinis | Date | Re: [xsl] Getting text and non-bloc, G. Ken Holman g.ken. |
| Month |