Hi Lynda,
don't differentiate between <MessageID> and </MessageID>. Of course
there is a difference, because the one opens an element, the other
closes it, but they absolutely belong together. Your sentence
> I need just of copy of the element <MessageID> following the source
> <MessageID> and </Message> following the source </MessageID>
expressed in a way a bit more XSLT or XPath: you want to have a *nested*
<MessageID/>. Or as *child* of a <MessageID/> *element*, you want to
have a second <MessageID/>.
With the templates I already sent, it's really easy. Change the second
one two:
<xsl:template match="MessageID">
<xsl:copy>
<xsl:copy>
</xsl:copy>
</xsl:copy>
</xsl:template>
If <MessageID/> has any attribute, you can change the template to:
<xsl:template match="MessageID">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:copy>
<xsl:apply-templates select="@*"/>
</xsl:copy>
</xsl:copy>
</xsl:template>
See the both ways to get all attributes copied. The second one does only
work because of the identity transformation template.
May I ask, why you need the nested <MessageID/> elements? It looks a bit
strange.
Regards,
Joerg
LVanvleet(_at_)newark(_dot_)com wrote:
Joerg,
Thanks for your timely reply. I understand you technique but that puts an
entire duplicate<MessageID>...</MessageID> following the current
<MessageID>...</MessageID>
I need just of copy of the element <MessageID> following the source
<MessageID> and </Message> following the source </MessageID>
Sorry I wasn't very clear.
Lynda
-----Original Message-----
From: Joerg Heinicke [mailto:joerg(_dot_)heinicke(_at_)gmx(_dot_)de]
Hello Lynda,
hmm, I are copying in the wrong way. From the root context you are
copying everything, you should copy node by node. You can read at
http://www.w3.org/TR/xslt#copying how identity transformation can look like:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
Then you only need to add further template matching on <MessageID/> and
say there, that you want to have it twice in the output:
<xsl:template match="MessageID">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
Regards,
Joerg
LVanvleet(_at_)newark(_dot_)com wrote:
I have sucessfully copied all the elements in source xml to result xml but
I also want duplicates of some elements. In the partial xml doc below I
want the result to contain two copies of the <MessageID> and </MessageID>
elements.
I am using this XSLT:
<?xml version='1.0'?>
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<!-- copy all the elements to the result document -->
<xsl:template match="/">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="Order">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="//ListOfMessageID/MessageID">
<!-- add an extra <MessageID> and </MessageID> element -->
<xsl:element name="MessageID"/>
<xsl:apply-templates select="node()"/>
</xsl:template>
</xsl:transform>
On a document that starts with the elements:
<?xml version="1.0"?>
<!-- Exostar xCBL 3.0 Order ICD -->
<Order>
<OrderHeader>
<OrderNumber>
<BuyerOrderNumber>3</BuyerOrderNumber>
<SellerOrderNumber/>
<ListOfMessageID>
<MessageID>
<IDNumber/>
<IDAssignedBy>
<IDAssignedByCoded/>
<IDAssignedByCodedOther/>
</IDAssignedBy>
<IDAssignedDate/>
</MessageID>
</ListOfMessageID>
</OrderNumber>
Lynda Van Vleet
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list