There are at least a couple of different approaches to this via the typeswitch
strategy, but I think the simplest would be:
1. In your function for closer, recurse over the child nodes as usual (which I
assume will output a <closer> element, or whatever you transform it to), then
process your postscript children:
for $ps in $node/tei:postscript
return <postscript>{$ps/@*, eccoparse:recurse($ps)}</postscript>
2. Extend your postscript function so it returns null if the postscript is a
child of <closer>:
declare function eccoparse:postscript($node as element(tei:postscript)) as
element()*
{
if ($node/parent::tei:closer) then ()
else <postscript>{$node/@*}{eccoparse:recurse($node)}</postscript>
}
Speaking as someone who wrote a lot of pseudo-templates in XQuery before
MarkLogic added an XSLT 2.0 parser to their product, this is one area where XSLT
is a lot more pleasant to use, if that's a possibility.
David
On Tue, 23 Oct 2012, Martin Mueller wrote:
I have used the xquery typeswitch function to transform elements from a TEI
file, but I am stymied by a task involving the following fragment:
<closer>
<signed>Your ever affectionate WOODVILLE.</signed>
<postscript>
<p>P.S. You have a house, within a mile of York; where we
have spent many happy days—<q rend="inline">"Days of ease, and nights of
pleasure."</q> Who knows but we may there recover our juve‑nile tastes and
passions! impossible! As well when advanced in life, might we hope to
reco‑ver our youth, <hi>in those fields where we once were young.</hi>—But
is that house untenanted? Will you be our host? Or have you lett, or lent
it?</p>
</postscript>
</closer>
I want to move the <postscript> element from its position as the last child
of <closer> into the position of right sibling of <closer> so that the
desire output would look like this:
<closer>
<signed>Your ever affectionate WOODVILLE.</signed>
</closer>
<postscript>
<p>P.S. You have a house, within a mile of York; where we
have spent many happy days—<q rend="inline">"Days of ease, and nights of
pleasure."</q> Who knows but we may there recover our juve‑nile tastes and
passions! impossible! As well when advanced in life, might we hope to
reco‑ver our youth, <hi>in those fields where we once were young.</hi>—But
is that house untenanted? Will you be our host? Or have you lett, or lent
it?</p>
</postscript>
How do I do this? In a typeswitch function the different tasks relating to
elements are carried out by subsidiary function. Here is the postscript
function that simply passes through the element:
declare function eccoparse:postscript($node as element(tei:postscript)) as
element()
{
<postscript>{$node/@*}{eccoparse:recurse($node)}</postscript>
};
I know how to various things that would change the postscript element but
leave it in its current place. But how do I put it in another place without
changing anything in it? Is this a task that should be done at the level of
the parent element?
I'll be grateful for any advice.
Martin Mueller
Professor emeritus of English and Classics
Northwestern University
--
David Sewell, Editorial and Technical Manager
ROTUNDA, The University of Virginia Press
PO Box 400314, Charlottesville, VA 22904-4314 USA
Email: [email protected] Tel: +1 434 924 9973
Web: http://rotunda.upress.virginia.edu/
_______________________________________________
[email protected]
http://x-query.com/mailman/listinfo/talk