Subject: [xsl] Re: Merge Two Files From: Brad Felix <bfelix25@xxxxxxxxx> Date: Sat, 4 Jul 2009 15:28:05 -0700 (PDT) |
Perfect. Thanks to both of you. brad ----- Original Message ---- From: Brad Felix <bfelix25@xxxxxxxxx> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx Sent: Friday, July 3, 2009 10:44:58 AM Subject: Merge Two Files I've searched and hacked a bit and am a little stuck, and sense the answer is simple. I'm trying to merge two files, matched by ID. As follows: file 1: <?xml version="1.0"?> <chapter> <title>Some Title</title> <section id="sec1"> <title>My Title</title> <para id="1">Some content</para> <para id="2">Some content</para> <para id="3">Some content</para> <para id="4">Some content</para> <para id="5">Some content</para> <para id="6">Some content</para> <para id="7">Some content</para> <para id="8">Some content</para> </section> </chapter> file 2: <?xml version="1.0" encoding="UTF-8" ?> <personalnotes> <note id="1">Here is a sample 1 annotation</note> <note id="2">Here is a sample 2 annotation</note> <note id="3">Here is a sample 3 annotation</note> <note id="4">Here is a sample 4 annotation</note> </personalnotes> File 1 provides the "master" and the result of the merge should look like: <?xml version="1.0"?> <chapter> <title>Business Ethics and Social Responsibility</title> <section id="sec1"> <title>My Title</title> <para id="1">Some content</para> <para role="note" id="1">Here is a sample 1 annotation</para> <para id="2">Some content</para> <para role="note" id="2">Here is a sample 2 annotation</para> <para id="3">Some content</para> <para role="note" id="3">Here is a sample 3 annotation</para> <para id="4">Some content</para> <para role="note" id="4">Here is a sample 4 annotation</para> <para id="5">Some content</para> <para id="6">Some content</para> <para id="7">Some content</para> <para id="8">Some content</para> </section> </chapter> I'm working with this as a starting point but cannot seem to get it right (this just basically copies file1 to the output): <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml"/> <!-- load the merge file --> <xsl:variable name="file1" select="/" /> <xsl:variable name="file2" select="document('annotations.xml')"/> <xsl:variable name="file2IDs" select="$file2//@id" /> <xsl:template match="/"> <xsl:call-template name="copyNode"/> </xsl:template> <xsl:template name="copyNode"> <xsl:for-each select="child::*"> <xsl:variable name="elemName" select="name()"/> <xsl:choose> <xsl:when test="$file1//*[@id = $file2IDs]"> <xsl:copy-of select="$file1/*[name()=$elemName]"/> <xsl:copy-of select="$file2/*[name()=$elemName]"/> </xsl:when> <xsl:otherwise> <xsl:copy-of select="$file1/*[name()=$elemName]"/> </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:template> </xsl:stylesheet> Any thoughts appreciated! Thanks brad
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] SET-INTERSECTION function, mark bordelon | Thread | [xsl] Elegant way to create an empt, Jan Hoeft |
RE: [xsl] SET-INTERSECTION function, mark bordelon | Date | [xsl] Elegant way to create an empt, Jan Hoeft |
Month |