Altova Mailing List Archives>Archive Index >microsoft.public.xsl Archive Home >Recent entries [Thread Prev] >Thread Next - Re: Loop through children Loop through childrenTo: NULL Date: 3/27/2008 3:03:00 PM
If I have the following xml:
<?xml version="1.0" encoding="utf-8"?>
<REPORT VERSION="1.10" FILENUM="" DESCRIPTION="Form Utility XML: 3/18/2008
12:27:13 PM" MAJORFORM="1004">
<ORDER></ORDER>
<TRACKING></TRACKING>
<FORMS>
<FORM NUM="1" FORMCODE="1004" SECCODE="1" DESC="" MAJOR="True" >
<FIELDS>
<OTHERFILENUMBER>692</OTHERFILENUMBER>
<FNMA_FILENUMBER>693</FNMA_FILENUMBER>
<SUBPROPADDRESS>3</SUBPROPADDRESS>
</FIELDS>
<FORMPHOTOS></FORMPHOTOS>
<ATTACHMENTS></ATTACHMENTS>
</FORM>
</FORMS>
</REPORT>
I have can have about 200 nodes under the <FIELDS> node.
Each node has it's own name.
What I am looking for is to build an style sheet that loops through the
children and creates a set of nodes that would look something like:
<?xml version="1.0" encoding="utf-8"?>
<REPORT>
<form>
<sectionNumber>1</sectionNumber>
<primary>True</primary>
<formName>1004</formName>
<tagName>OTHERFILENUMBER</tagName>
<value>692</value>
<form>
<form>
<sectionNumber>1</sectionNumber>
<primary>True</primary>
<formName>1004</formName>
<tagName>FNMA_FILENUMBER</tagName>
<value>693</value>
<form>
<form>
<sectionNumber>1</sectionNumber>
<primary>True</primary>
<formName>1004</formName>
<tagName>SUBPROPADDRESS</tagName>
<value>SUBPROPADDRESS</value>
<form>
</REPORT>
The xslt file I was working with is:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/*">
<root_node>
<xsl:apply-templates>
<xsl:sort select="form/@Major" order="descending"/>
</xsl:apply-templates>
</root_node>
</xsl:template>
<xsl:template match="FIELDS">
<form>
<sectionNumber>
<xsl:value-of select="ancestor::FORM/@SECCODE"/>
</sectionNumber>
<primary>
<xsl:value-of select="ancestor::FORM/@MAJOR"/>
</primary>
<formName>
<xsl:value-of select="ancestor::FORM/@FORMCODE"/>
</formName>
<tagName>
<xsl:value-of select="name()"/>
</tagName>
<value>
<xsl:value-of select="*"/>
</value>
</form>
</xsl:template>
</xsl:stylesheet>
This almost works for the first one but I need it to loop through each tag.
I tried using <xsl:for-each...> but couldn't seem to get it to work.
I also get FIELDS in the <tagName> tag. That is because name() is using the
name of the current tag (I suppose) that I found in the match.
I can't seem to get the <xsl:copy> to work for my root node (to get the name
of the Root Node). Actually it works, but it puts
(xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance) in the <form> tag.
But the root node is <REPORT> as I wanted.
This is when I do it like this.
<xsl:copy>
<xsl:apply-templates>
<xsl:sort select="form/@Major" order="descending"/>
</xsl:apply-templates>
</xsl:copy>
If I do it as above, it puts tne xmlns stuff in the root node, which is now
<root_node xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">. How do I
fix that?
Thanks,
Tom
| ||||||
| Company | Legal | Press | Partners | Careers | Sitemap | Contact Us | Altova Blog | Mobile | Full Site | |||
|
