Click to See Complete Forum and Search --> : XML identity transform does not "copy" attributes


apie_be
06-18-2009, 10:31 AM
Hi,

I have an XML file which I would like to resort based on 2 attribute values. I use for this an XSL file. When I apply the stylesheet to the XML, the XML file is sorted just the way I want it, but all attributes are gone.

I've tried for hours looking on the net to find a solution. Can anyone help me?

Thank you...

Input

<?xml version="1.0" encoding="UTF-8"?>
<CodingList level="01.001" extractTime="2009-3-30T16:25:30">
<CodingScheme name="Zaventem" codeLen="1" codeType="NUMERIC" version="1">
<Descriptions>
<Description lang="fr">Zaventem French description</Description>
<Description lang="nl">Zaventem Dutch description</Description>
</Descriptions>
<CodeValues>
<CodeValue code="4">
<Text lang="fr">Zaventem code value 4 French decsription</Text>
<Text lang="nl">Zaventem code value 4 Dutch decsription</Text>
</CodeValue>
<CodeValue code="14">
<Text lang="fr">Zaventem code value 14 French decsription</Text>
<Text lang="nl">Zaventem code value 14 Dutch decsription</Text>
</CodeValue>
</CodeValues>
</CodingScheme>
<CodingScheme name="Antwerpen" codeLen="1" codeType="NUMERIC" version="1">
<Descriptions>
<Description lang="fr">Antwerpen French description</Description>
<Description lang="nl">Antwerpen Dutch description</Description>
</Descriptions>
<CodeValues>
<CodeValue code="10">
<Text lang="fr">Antwerpen code value 10 French decsription</Text>
<Text lang="nl">Antwerpen code value 10 Dutch decsription</Text>
</CodeValue>
<CodeValue code="1">
<Text lang="fr">Antwerpen code value 1 French decsription</Text>
<Text lang="nl">Antwerpen code value 1 Dutch decsription</Text>
</CodeValue>
<CodeValue code="3">
<Text lang="fr">Antwerpen code value 3 French decsription</Text>
<Text lang="nl">Antwerpen code value 3 Dutch decsription</Text>
</CodeValue>
<CodeValue code="2">
<Text lang="fr">Antwerpen code value 2 French decsription</Text>
<Text lang="nl">Antwerpen code value 2 Dutch decsription</Text>
</CodeValue>
</CodeValues>
</CodingScheme>
<CodingScheme name="Brussel" codeLen="1" codeType="NUMERIC" version="1">
<Descriptions>
<Description lang="fr">Brussel French description</Description>
<Description lang="nl">Brussel Dutch description</Description>
</Descriptions>
<CodeValues>
<CodeValue code="1">
<Text lang="fr">Brussel code value 1 French decsription</Text>
<Text lang="nl">Brussel code value 1 Dutch decsription</Text>
</CodeValue>
<CodeValue code="100">
<Text lang="fr">Brussel code value 100 French decsription</Text>
<Text lang="nl">Brussel code value 100 Dutch decsription</Text>
</CodeValue>
<CodeValue code="33">
<Text lang="fr">Brussel code value 33 French decsription</Text>
<Text lang="nl">Brussel code value 33 Dutch decsription</Text>
</CodeValue>
</CodeValues>
</CodingScheme>
</CodingList>

XSL

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" encoding="utf-8"/>

<xsl:template match="CodingList">
<xsl:copy>
<xsl:apply-templates>
<xsl:sort select="@name" data-type="text" order="ascending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>

<xsl:template match="CodeValues">
<xsl:copy>
<xsl:apply-templates>
<xsl:sort select="@code" data-type="number" order="ascending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>

<xsl:template match="@*|node()|text()">
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>

</xsl:stylesheet>

Output

<?xml version="1.0"?>
<CodingList>
<CodingScheme>
<Descriptions>
<Description>Antwerpen French description</Description>
<Description>Antwerpen Dutch description</Description>
</Descriptions>
<CodeValues>
<CodeValue>
<Text>Antwerpen code value 1 French decsription</Text>
<Text>Antwerpen code value 1 Dutch decsription</Text>
</CodeValue>
<CodeValue>
<Text>Antwerpen code value 2 French decsription</Text>
<Text>Antwerpen code value 2 Dutch decsription</Text>
</CodeValue>
<CodeValue>
<Text>Antwerpen code value 3 French decsription</Text>
<Text>Antwerpen code value 3 Dutch decsription</Text>
</CodeValue>
<CodeValue>
<Text>Antwerpen code value 10 French decsription</Text>
<Text>Antwerpen code value 10 Dutch decsription</Text>
</CodeValue>
</CodeValues>
</CodingScheme>
<CodingScheme>
<Descriptions>
<Description>Brussel French description</Description>
<Description>Brussel Dutch description</Description>
</Descriptions>
<CodeValues>
<CodeValue>
<Text>Brussel code value 1 French decsription</Text>
<Text>Brussel code value 1 Dutch decsription</Text>
</CodeValue>
<CodeValue>
<Text>Brussel code value 33 French decsription</Text>
<Text>Brussel code value 33 Dutch decsription</Text>
</CodeValue>
<CodeValue>
<Text>Brussel code value 100 French decsription</Text>
<Text>Brussel code value 100 Dutch decsription</Text>
</CodeValue>
</CodeValues>
</CodingScheme>
<CodingScheme>
<Descriptions>
<Description>Zaventem French description</Description>
<Description>Zaventem Dutch description</Description>
</Descriptions>
<CodeValues>
<CodeValue>
<Text>Zaventem code value 4 French decsription</Text>
<Text>Zaventem code value 4 Dutch decsription</Text>
</CodeValue>
<CodeValue>
<Text>Zaventem code value 14 French decsription</Text>
<Text>Zaventem code value 14 Dutch decsription</Text>
</CodeValue>
</CodeValues>
</CodingScheme>
</CodingList>

Charles
06-18-2009, 03:28 PM
You need to apply templates for the attributes separately:<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:copy>

apie_be
06-19-2009, 02:25 AM
Thank you. This works excelent.

Just one thing. In the output file has only <?xml version="1.0"?> instead of <?xml version="1.0" encoding="UTF-8"?>.

Is there a way to have the encoding included?

Thanx

Charles
06-19-2009, 08:53 AM
Yes but it might be a bit processor dependant. Which one are you using?

apie_be
06-19-2009, 09:05 AM
Mindfusion XML Viewer

Charles
06-19-2009, 10:36 AM
I'm not familiar with that one. Check its documentation. There should be something in there.

apie_be
06-22-2009, 09:11 AM
For those interested, the solution:


<?xml version="1.0"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" encoding="utf-8"/>

<xsl:template match="CodingList">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates>
<xsl:sort select="@name" data-type="text" order="ascending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>

<xsl:template match="CodeValues">
<xsl:copy>
<xsl:apply-templates>
<xsl:sort select="@code" data-type="number" order="ascending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>

<xsl:template match="@*|node()|text()">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>

</xsl:transform>