I need to split a set of elements into two sets, while merging in
another set of elements. My XML input looks like so:
<client>
...
<military_legal_assessments>
<military_assessment date_added='2002-06-21T14:28:16'
date_updated="2002-08-02T10:11:55">
<veteran>true</veteran>
<current_warrant>true</current_warrant>
</military_assessment>
</military_legal_assessments>
...
<arrest_records>
<arrest_record date_added='2002-04-21T16:30:50'
date_updated="2002-09-23T09:26:45">
<date_arrested>12/1/2001</date_arrested>
<charge>What was the client arrested for (what charge)</charge>
<place>Where did the arrest occur</place>
<descrip>Details about the arrest</descrip>
</arrest_record>
...
</arrest_records>
...
</client>
I need to split each military_legal_assesment into two assessments
(military_assessment and legal_assessment) and also dump the arrest
records as legal assessments. So the above would transform into this:
<client>
...
<legal_assessments>
<legal_assessment date_added='2002-06-21T14:28:16'
date_updated="2002-08-02T10:11:55">
<current_warrant>true</current_warrant>
</legal_assessment>
<legal_assessment date_added='2002-04-21T16:30:50'
date_updated="2002-09-23T09:26:45">
<charge>What was the client arrested for (what charge)</charge>
<place>Where did the arrest occur</place>
</legal_assessment>
...
</legal_assessments>
<military_assessments>
<military_assessment date_added='2002-06-21T14:28:16'
date_updated="2002-08-02T10:11:55">
<veteran>true</veteran>
</military_assessment>
...
</military_assessments>
</client>
I am stuck on how to correctly handle the arrest records. Everything
seems to process OK but I get two legal_assessments elements where I
need/want/can only have one. Here is my template and the corresponding
output (Note that there is a node-set variable named
$legal_assessment_fields that defines the names of all the elements that
need to go into the legal assessment):
<xsl:template
match="client/military_legal_assessments|client/arrest_records">
<xsl:if test="name()='military_legal_assessments'">
<military_assessments>
<xsl:for-each select="node()">
<xsl:element name="military_assessment">
<xsl:copy-of select="@*"/>
<xsl:copy-of
select="node()[not(name()=$legal_assessment_fields)]"/>
</xsl:element>
</xsl:for-each>
</military_assessments>
</xsl:if>
<legal_assessments>
<xsl:for-each select="node()">
<xsl:element name="legal_assessment">
<xsl:copy-of select="@*"/>
<xsl:copy-of select="node()[name()=$legal_assessment_fields]"/>
</xsl:element>
</xsl:for-each>
</legal_assessments>
Here is the output, note the two legal_assessments elements
<client>
...
<military_assessments>
<military_assessment date_added="2002-06-21T16:30:50"
date_updated="2002-08-23T09:26:45">
<veteran>true</veteran>
</military_assessment>
...
</military_assessments>
<legal_assessments>
<legal_assessment date_added="2002-06-21T16:30:50"
date_updated="2002-08-23T09:26:45">
<current_warrant>true</current_warrant>
</legal_assessment>
...
</legal_assessments>
...
<legal_assessments>
<legal_assessment date_added="2002-04-21T16:30:50"
date_updated="2002-09-23T09:26:45">
<date_arrested>12/1/2001</date_arrested>
<charge>What was the client arrested for (what
charge)</charge>
<place>Where did the arrest occur</place>
<descrip>Details about the arrest</descrip>
</legal_assessment>
...
</legal_assessments>
...
</client>
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list