Go figure, Priscilla Walmsley's XQuery (sitting on my desk the whole time, http://www.amazon.com/gp/product/0596006349) has a section entitled "Adding Attributes to an Element". It's nearly identical to the function I've been using (with your help):

define function util:add-attribute($element as element(), $name as xs:string, $value as xs:anyAtomicType?)
{
        element { node-name($element) } {
                attribute { $name } { $value },
                $element/@*,
                $element/node()
        }
}

Only difference is she's using $value as xs:anyAtomicType? (I had $value as xs:string, definitely not as flexible) and constructing and inserting the new attribute before the old ones.

My question is this: how expensive is this element/attribute reconstruction? For example, a large xhtml structure full of div, p, a, span, table, tr, th, td, and actual data, can easily be 10kb.

Are there ML facilities for measuring expense of specific function calls?

Eric

Mary Holstege wrote:
On Mon, 15 Sep 2008 12:44:47 -0700, Eric Palmitesta <[EMAIL PROTECTED]> wrote:

Hey Mary, this seems fundamentally important, can you elaborate?

(For example why x$/node() rather than $x/child::*)

Eric


Because $x/node() matches all child nodes, be there text, element, comments,
or processing instructions, whereas $x/child::* only selects elements.
This is because wildcard tests only match against the "principal node
kind" of the axis. In the case of child:: this is element.  So the
query as written with $x/text(), $x/child::* means: take all the text
content of the node, put it up front, then follow it by all the elements.

So:
<scramble>Here<!-- with a comment --> is a <b>simple</b> example</scramble>
would come out of function g as:
   <scamble new="new">Here is a  example<b>simple</b></scramble>

//Mary

Mary Holstege wrote:
On Mon, 15 Sep 2008 10:55:08 -0700, Florent Georges <[EMAIL PROTECTED]> wrote:

Eric Palmitesta wrote:

  Hi

It works.  Is there a better way though?  Also, what's the
point of xdmp:node-insert-child if it can't operate on an
argument to a function?

  Yes it can, but not on constructed nodes.  You can make a bit
more generic:

    define function g($x as element()) as element()
    {
       element { node-name($x) } {
         $x/text(),
         $x/child::*,
         $x/attribute::*,
         attribute new{ "new" }
       }
    }

 Actually, you need to be a little careful here.
Attributes should come first, and the query above will reorder
text children relative to your element children.  What you want is:
 element {node-name($x)} {
  $x/@*,
  attribute new {"new"},
  $x/node()
}
 //Mary
_______________________________________________
General mailing list
[email protected]
http://xqzone.com/mailman/listinfo/general
_______________________________________________
General mailing list
[email protected]
http://xqzone.com/mailman/listinfo/general


_______________________________________________
General mailing list
[email protected]
http://xqzone.com/mailman/listinfo/general
_______________________________________________
General mailing list
[email protected]
http://xqzone.com/mailman/listinfo/general

Reply via email to