Correction: Re: [xquery-talk] XQuery function to do elementX/not-elementX chunking?

Jason Hunter jhunter at xquery.com
Tue Sep 13 17:15:53 PDT 2005


Are the <ref> elements only at the top level in the sequence?  If 
they're under other elements, what behavior do you want?

-jh-

David Sewell wrote:

> Someone will object that the sequence of sequences I claimed was my
> goal will be flattened. What I really want as output is something like
> 
> <span>This text has <i>italics</i> and</span>
> <span>an embedded ref</span>
> 
> so I'm really looking sequentially for node sequences defined as either
> (1) a single <ref> or (2) a sequence of one or more non-<ref> nodes.
> 
> On Tue, 13 Sep 2005, David Sewell wrote:
> 
> 
>>Given an XML element like this:
>>
>>  <ref>This text has <i>italics</i> and <ref>an embedded ref</ref> and
>>    more text including <b>boldface</b> and <ref>another ref</ref>
>>    and a bit more text.</ref>
>>
>>I want to break this into a sequence of sequences of its node children
>>like so (with text nodes represented as strings, ignoring linebreaks):
>>
>>(
>>  ( 'This text has ', <i>italics</i>, ' and ' ) ,
>>  <ref>an embedded ref</ref>,
>>  ( ' and more text including ', <b>boldface</b>, ' and ' ),
>>  <ref>another ref</ref>,
>>  'and a bit more text.'
>>)
>>
>>In other words, pull out alternating sequences of (1) <ref> elements and
>>(2) other nodes that are not <ref> elements. (The practical application is
>>so that the <ref>s can be transformed into HTML <span>s without
>>permitting embedded <spans>s -- they are HTML-legal but cause certain
>>problems.)
>>
>>I was able to do this by writing a 10-line function that relies on a
>>fairly clunky process of selecting all the <ref> children and then
>>chunking the other nodes that precede and/or follow them; it relies on
>>some fairly ugly use of preceding-sibling(), following-sibling(),
>>name(), and the '>>' operator. It's so ugly that I don't want to inflict
>>it this list (unless someone insists).
>>
>>Does anyone have a simple, elegant way to do this?
>>
>>
> 
> 


More information about the talk mailing list