![]() |
![]() | ![]() | ![]() | Altova Mailing List Archives>Archive Index >microsoft.public.xsl Archive Home >Recent entries >Thread Prev - Re: Loop through children >Thread Next - Re: Loop through children Re: Loop through childrenTo: NULL Date: 3/28/2008 9:13:00 AM "tshad" <tshad@d...> wrote in message news:uqbUSBGkIHA.5584@T...... > I tried this following and it only gives me the first child and FIELDS for > the tag name: > > <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="/*"> > <xsl:copy> > <xsl:apply-templates> > <xsl:sort select="form/@Major" order="descending"/> > </xsl:apply-templates> > </xsl:copy> > </xsl:template> > <xsl:template match="FIELDS"> > <form> > <xsl:for-each select="child"> > <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> > </xsl:for-each> > </form> > </xsl:template> > </xsl:stylesheet> > > The result is: > > <?xml version="1.0" encoding="utf-8"?> > <form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> > <tagName>FIELDS</tagName> > <value>692</value> > </form> > > Thanks, > > Tom > "tshad" <tshad@d...> wrote in message > news:el86taFkIHA.4356@T...... >> 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 >> > > If you are in the FIELDS template then a for-each on * or apply-template * will process the children. To get rid of the unwanted namespace declarations use exclude-result-prefixes="xsi" in the xsl:stylesheet element. -- Joe Fawcett (MVP - XML) http://joe.fawcett.name | ![]() | ![]() | ![]() |
| Company | Legal | Press | Partners | Careers | Sitemap | Contact Us | Altova Blog | |||||
|
