Search code examples
xmlxsltnested-loops

XSL transform of XML - unwanted additional text being displayed


I've been putting together an XSL, with the help of a previous posting to transform some XML. I now have the XSL outputting the correct data but I two problems. 1) I have some additional text being displayed that I don't want that preceeds each tag such as:

BUUBIF
BUBSBAT02
USBIFA

2) My loop is not quite correct. The tag should encapsulate each iteration of content

<CourseCode/>
<Version/>
<EndDate/>
<PrimaryDisciplineCode/>
<StartDate/>
<Description/>
<FacultyCode/>

My XML has some course data that loops through two related records then onto the next course, so in terms of the entities it should loop through VCO, CBK, CRS, and then start again.

My XML:

<?xml version="1.0" encoding="UTF-8" ?>
<exchange>
<vco>
<vco.srs>
<vco_crsc.vco.srs>BUUBIF</vco_crsc.vco.srs>
<vco_prgc.vco.srs>BUBSBAT02</vco_prgc.vco.srs>
<vco_rouc.vco.srs>USBIFI</vco_rouc.vco.srs>
<cbo>
<cbo.srs>
<cbo_occl.cbo.srs>AJ</cbo_occl.cbo.srs>
<crs>
<crs.srs>
<crs_titl.crs.srs>BSc Banking &amp; Int Finance</crs_titl.crs.srs>
<crs_dptc.crs.srs>B</crs_dptc.crs.srs>
<crs_begd.crs.srs>2003-08-01</crs_begd.crs.srs>
</crs.srs>
</crs>
</cbo.srs>
<cbo.srs>
<cbo_occl.cbo.srs>AJ</cbo_occl.cbo.srs>
<crs>
<crs.srs>
<crs_titl.crs.srs>BSc Banking &amp; Int Finance</crs_titl.crs.srs>
<crs_dptc.crs.srs>B</crs_dptc.crs.srs>
<crs_begd.crs.srs>2003-08-01</crs_begd.crs.srs>
</crs.srs>
</crs>
</cbo.srs>
<cbo.srs>
<cbo_occl.cbo.srs>AJ</cbo_occl.cbo.srs>
<crs>
<crs.srs>
<crs_titl.crs.srs>BSc Banking &amp; Int Finance</crs_titl.crs.srs>
<crs_dptc.crs.srs>B</crs_dptc.crs.srs>
<crs_begd.crs.srs>2003-08-01</crs_begd.crs.srs>
</crs.srs>
</crs>
</cbo.srs>
<cbo.srs>
<cbo_occl.cbo.srs>AJ</cbo_occl.cbo.srs>
<crs>
<crs.srs>
<crs_titl.crs.srs>BSc Banking &amp; Int Finance</crs_titl.crs.srs>
<crs_dptc.crs.srs>B</crs_dptc.crs.srs>
<crs_begd.crs.srs>2003-08-01</crs_begd.crs.srs>
</crs.srs>
</crs>
</cbo.srs>
<cbo.srs>
<cbo_occl.cbo.srs>FJ</cbo_occl.cbo.srs>
<crs>
<crs.srs>
<crs_titl.crs.srs>BSc Banking &amp; Int Finance</crs_titl.crs.srs>
<crs_dptc.crs.srs>B</crs_dptc.crs.srs>
<crs_begd.crs.srs>2003-08-01</crs_begd.crs.srs>
</crs.srs>
</crs>
</cbo.srs>
<cbo.srs>
<cbo_occl.cbo.srs>AJ</cbo_occl.cbo.srs>
<crs>
<crs.srs>
<crs_titl.crs.srs>BSc Banking &amp; Int Finance</crs_titl.crs.srs>
<crs_dptc.crs.srs>B</crs_dptc.crs.srs>
<crs_begd.crs.srs>2003-08-01</crs_begd.crs.srs>
</crs.srs>
</crs>
</cbo.srs>
<cbo.srs>
<cbo_occl.cbo.srs>FJ</cbo_occl.cbo.srs>
<crs>
<crs.srs>
<crs_titl.crs.srs>BSc Banking &amp; Int Finance</crs_titl.crs.srs>
<crs_dptc.crs.srs>B</crs_dptc.crs.srs>
<crs_begd.crs.srs>2003-08-01</crs_begd.crs.srs>
</crs.srs>
</crs>
</cbo.srs>
</cbo>
</vco.srs>
<vco.srs>
<vco_crsc.vco.srs>BUUBIF</vco_crsc.vco.srs>
<vco_prgc.vco.srs>BUBSBAT02</vco_prgc.vco.srs>
<vco_rouc.vco.srs>USBIFA</vco_rouc.vco.srs>
<cbo>
<cbo.srs>
<cbo_occl.cbo.srs>AJ</cbo_occl.cbo.srs>
<crs>
<crs.srs>
<crs_titl.crs.srs>BSc Banking &amp; Int Finance</crs_titl.crs.srs>
<crs_dptc.crs.srs>B</crs_dptc.crs.srs>
<crs_begd.crs.srs>2003-08-01</crs_begd.crs.srs>
</crs.srs>
</crs>
</cbo.srs>
<cbo.srs>
<cbo_occl.cbo.srs>AJ</cbo_occl.cbo.srs>
<crs>
<crs.srs>
<crs_titl.crs.srs>BSc Banking &amp; Int Finance</crs_titl.crs.srs>
<crs_dptc.crs.srs>B</crs_dptc.crs.srs>
<crs_begd.crs.srs>2003-08-01</crs_begd.crs.srs>
</crs.srs>
</crs>
</cbo.srs>
<cbo.srs>
<cbo_occl.cbo.srs>AJ</cbo_occl.cbo.srs>
<crs>
<crs.srs>
<crs_titl.crs.srs>BSc Banking &amp; Int Finance</crs_titl.crs.srs>
<crs_dptc.crs.srs>B</crs_dptc.crs.srs>
<crs_begd.crs.srs>2003-08-01</crs_begd.crs.srs>
</crs.srs>
</crs>
</cbo.srs>
<cbo.srs>
<cbo_occl.cbo.srs>AJ</cbo_occl.cbo.srs>
<crs>
<crs.srs>
<crs_titl.crs.srs>BSc Banking &amp; Int Finance</crs_titl.crs.srs>
<crs_dptc.crs.srs>B</crs_dptc.crs.srs>
<crs_begd.crs.srs>2003-08-01</crs_begd.crs.srs>
</crs.srs>
</crs>
</cbo.srs>
<cbo.srs>
<cbo_occl.cbo.srs>FJ</cbo_occl.cbo.srs>
<crs>
<crs.srs>
<crs_titl.crs.srs>BSc Banking &amp; Int Finance</crs_titl.crs.srs>
<crs_dptc.crs.srs>B</crs_dptc.crs.srs>
<crs_begd.crs.srs>2003-08-01</crs_begd.crs.srs>
</crs.srs>
</crs>
</cbo.srs>
<cbo.srs>
<cbo_occl.cbo.srs>AJ</cbo_occl.cbo.srs>
<crs>
<crs.srs>
<crs_titl.crs.srs>BSc Banking &amp; Int Finance</crs_titl.crs.srs>
<crs_dptc.crs.srs>B</crs_dptc.crs.srs>
<crs_begd.crs.srs>2003-08-01</crs_begd.crs.srs>
</crs.srs>
</crs>
</cbo.srs>
<cbo.srs>
<cbo_occl.cbo.srs>FJ</cbo_occl.cbo.srs>
<crs>
<crs.srs>
<crs_titl.crs.srs>BSc Banking &amp; Int Finance</crs_titl.crs.srs>
<crs_dptc.crs.srs>B</crs_dptc.crs.srs>
<crs_begd.crs.srs>2003-08-01</crs_begd.crs.srs>
</crs.srs>
</crs>
</cbo.srs>
</cbo>
</vco.srs>
</vco>
</exchange>

My XSL

                <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes" method="xml"/>
<xsl:template match="/exchange">
<ImportTask>
<CourseVersions>
<CourseVersion>
<xsl:apply-templates select="*|@*"/>
</CourseVersion>
</CourseVersions>
</ImportTask>
</xsl:template>

<xsl:template match="cbo_occl.cbo.srs">
<CourseCode>
<!-- select all text-Nodes of vco_* elements -->
<xsl:for-each select="../../../*[matches(name(),'^vco_.*')]/text()">
<xsl:value-of select="concat(.,'-')"/>
</xsl:for-each>
<xsl:value-of select="."/>
</CourseCode>   
<Version>1</Version>
<EndDate>i:nil="true"</EndDate>
<PrimaryDisciplineCode>i:nil="true"</PrimaryDisciplineCode>
</xsl:template>

<xsl:template match="crs/crs.srs">
<xsl:for-each select="exchange/crs/crs.srs">
</xsl:for-each> 
<StartDate><xsl:value-of select="crs_begd.crs.srs"/></StartDate>
<Description><xsl:value-of select="crs_titl.crs.srs"/></Description>
<FacultyCode><xsl:value-of select="crs_dptc.crs.srs"/></FacultyCode>

</xsl:template>

</xsl:stylesheet> 

So this gives me output:

    <?xml version="1.0" encoding="UTF-8"?>
<ImportTask>
<CourseVersions>
<CourseVersion>

BUUBIF
BUBSBAT02
USBIFI

<CourseCode>BUUBIF-BUBSBAT02-USBIFI-AJ</CourseCode>
 <Version>1</Version>
 <EndDate>i:nil="true"</EndDate>
 <PrimaryDisciplineCode>i:nil="true"</PrimaryDisciplineCode>

 <StartDate>2003-08-01</StartDate>
 <Description>BSc Banking &amp; Int Finance</Description>
 <FacultyCode>B</FacultyCode>

 <CourseCode>BUUBIF-BUBSBAT02-USBIFI-AJ</CourseCode>
 <Version>1</Version>
 <EndDate>i:nil="true"</EndDate>
 <PrimaryDisciplineCode>i:nil="true"</PrimaryDisciplineCode>

 <StartDate>2003-08-01</StartDate>
 <Description>BSc Banking &amp; Int Finance</Description>
 <FacultyCode>B</FacultyCode>

 <CourseCode>BUUBIF-BUBSBAT02-USBIFI-AJ</CourseCode>
 <Version>1</Version>
 <EndDate>i:nil="true"</EndDate>
 <PrimaryDisciplineCode>i:nil="true"</PrimaryDisciplineCode>

 <StartDate>2003-08-01</StartDate>
 <Description>BSc Banking &amp; Int Finance</Description>
 <FacultyCode>B</FacultyCode>

 <CourseCode>BUUBIF-BUBSBAT02-USBIFI-AJ</CourseCode>
 <Version>1</Version>
 <EndDate>i:nil="true"</EndDate>
 <PrimaryDisciplineCode>i:nil="true"</PrimaryDisciplineCode>

 <StartDate>2003-08-01</StartDate>
 <Description>BSc Banking &amp; Int Finance</Description>
 <FacultyCode>B</FacultyCode>

 <CourseCode>BUUBIF-BUBSBAT02-USBIFI-FJ</CourseCode>
 <Version>1</Version>
 <EndDate>i:nil="true"</EndDate>
 <PrimaryDisciplineCode>i:nil="true"</PrimaryDisciplineCode>

 <StartDate>2003-08-01</StartDate>
 <Description>BSc Banking &amp; Int Finance</Description>
 <FacultyCode>B</FacultyCode>

 <CourseCode>BUUBIF-BUBSBAT02-USBIFI-AJ</CourseCode>
 <Version>1</Version>
 <EndDate>i:nil="true"</EndDate>
 <PrimaryDisciplineCode>i:nil="true"</PrimaryDisciplineCode>

 <StartDate>2003-08-01</StartDate>
 <Description>BSc Banking &amp; Int Finance</Description>
 <FacultyCode>B</FacultyCode>

 <CourseCode>BUUBIF-BUBSBAT02-USBIFI-FJ</CourseCode>
 <Version>1</Version>
 <EndDate>i:nil="true"</EndDate>
 <PrimaryDisciplineCode>i:nil="true"</PrimaryDisciplineCode>

 <StartDate>2003-08-01</StartDate>
 <Description>BSc Banking &amp; Int Finance</Description>
 <FacultyCode>B</FacultyCode>

BUUBIF
BUBSBAT02
USBIFA

<CourseCode>BUUBIF-BUBSBAT02-USBIFA-AJ</CourseCode>
 <Version>1</Version>
 <EndDate>i:nil="true"</EndDate>
 <PrimaryDisciplineCode>i:nil="true"</PrimaryDisciplineCode>

 <StartDate>2003-08-01</StartDate>
 <Description>BSc Banking &amp; Int Finance</Description>
 <FacultyCode>B</FacultyCode>

 <CourseCode>BUUBIF-BUBSBAT02-USBIFA-AJ</CourseCode>
 <Version>1</Version>
 <EndDate>i:nil="true"</EndDate>
 <PrimaryDisciplineCode>i:nil="true"</PrimaryDisciplineCode>

 <StartDate>2003-08-01</StartDate>
 <Description>BSc Banking &amp; Int Finance</Description>
 <FacultyCode>B</FacultyCode>

 <CourseCode>BUUBIF-BUBSBAT02-USBIFA-AJ</CourseCode>
 <Version>1</Version>
 <EndDate>i:nil="true"</EndDate>
 <PrimaryDisciplineCode>i:nil="true"</PrimaryDisciplineCode>

 <StartDate>2003-08-01</StartDate>
 <Description>BSc Banking &amp; Int Finance</Description>
 <FacultyCode>B</FacultyCode>

 <CourseCode>BUUBIF-BUBSBAT02-USBIFA-AJ</CourseCode>
 <Version>1</Version>
 <EndDate>i:nil="true"</EndDate>
 <PrimaryDisciplineCode>i:nil="true"</PrimaryDisciplineCode>

 <StartDate>2003-08-01</StartDate>
 <Description>BSc Banking &amp; Int Finance</Description>
 <FacultyCode>B</FacultyCode>

 <CourseCode>BUUBIF-BUBSBAT02-USBIFA-FJ</CourseCode>
 <Version>1</Version>
 <EndDate>i:nil="true"</EndDate>
 <PrimaryDisciplineCode>i:nil="true"</PrimaryDisciplineCode>

 <StartDate>2003-08-01</StartDate>
 <Description>BSc Banking &amp; Int Finance</Description>
 <FacultyCode>B</FacultyCode>

 <CourseCode>BUUBIF-BUBSBAT02-USBIFA-AJ</CourseCode>
 <Version>1</Version>
 <EndDate>i:nil="true"</EndDate>
 <PrimaryDisciplineCode>i:nil="true"</PrimaryDisciplineCode>

 <StartDate>2003-08-01</StartDate>
 <Description>BSc Banking &amp; Int Finance</Description>
 <FacultyCode>B</FacultyCode>

 <CourseCode>BUUBIF-BUBSBAT02-USBIFA-FJ</CourseCode>
 <Version>1</Version>
 <EndDate>i:nil="true"</EndDate>
 <PrimaryDisciplineCode>i:nil="true"</PrimaryDisciplineCode>

 <StartDate>2003-08-01</StartDate>
 <Description>BSc Banking &amp; Int Finance</Description>
 <FacultyCode>B</FacultyCode>

    </CourseVersion>
</CourseVersions>
</ImportTask>

Many thanks

Jonah


Solution

  • With <xsl:apply-templates select="*|@*"/> you process all attributes and child nodes and that means that for instance <vco_crsc.vco.srs>BUUBIF</vco_crsc.vco.srs> is processed by the built-in templates which finally output all text nodes.

    So either add <xsl:template match="text()"/> to avoid that text nodes create output or change the apply-templates to process only the two elements for which you have written templates: <xsl:apply-templates select="//cbo_occl.cbo.srs | //crs/crs.srs"/>.