Hello,

 

This is input XML:

<employee emp="1" dept="55">
    <name>Peter</name>
    <job>Director</job>
    <employee emp="12" dept="26">
        <name>John</name>
        <job>Animator</job>
        <employee emp="123" dept="27">
            <name>James</name>
            <job>Assistant</job>
        </employee>
    </employee>
</employee>

 

Desired output XML:

<employee emp="1" dept="55">
    <name>Peter</name>
    <job>Director</job>
</employee>

 

Overall, it is a so called ‘modified identity transformation’ in XSLT parlance.

Output XML shall be the same, except the child <employee> element and its children.

 

Question:

What is the best way to re-create existing root element with all its attributes?

 

My implementation:

xquery version "3.1";

 

declare context item := document {

<employee emp="1" dept="55">

        <name>Peter</name>

        <job>Director</job>

        <employee emp="12" dept="26">

                <name>John</name>

                <job>Animator</job>

                <employee emp="123" dept="27">

                        <name>James</name>

                        <job>Assistant</job>

                </employee>

        </employee>

</employee>

};

 

(: working version :)

element {fn:node-name(/*)}

{

let $y :=  ./*/@*

return $y,        (: copy all attributes :)

for $x in ./*/(* except employee)

return $x

}

 

(: NOT working version, trying to make it more concise :)

element {fn:node-name(/*)} {/*/@*}

{

return for $x in ./*/(* except employee)

return $x

}

 

 

Regards,
Yitzhak Khabinsky