How to select specific node sets in xslt

xslt, which I am currently using, generates all the tags in the root. I need to set a set of <row> and <config> .

Xml source:

 <root> <postdate>2011-03-30</postdate> <location>84</location> <meal>07:36</meal> <config> <postdate>2011-03-30</postdate> <location>84</location> <meal>07:36</meal> <checknumber>91339082011-03-30T07:36:12</checknumber> </config> <items> <row> <descriptor>7297364</descriptor> <qty>1</qty> <price>33</price> <value>33</value> <recordtype>1</recordtype> <postdate>2011-03-30</postdate> <location>84</location> </row> <row> <descriptor>7794473</descriptor> <qty>1</qty> <price>60</price> <value>60</value> <recordtype>1</recordtype> <postdate>2011-03-30</postdate> <location>84</location> </row> </items> <tenders> <row> <id>13</id> <value>117.99</value> <recordtype>2</recordtype> <postdate>2011-03-30</postdate> <location>84</location> </row> </tenders> <taxes> <row> <id>2</id> <value>8.25</value> <recordtype>3</recordtype> <postdate>2011-03-30</postdate> <location>84</location> </row> </taxes> </root> 

Xslt attempt:

 <xsl:stylesheet version="1.0" exclude-result-prefixes="msxsl" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"> <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> <xsl:template match="row/*"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet> 

Output Required:

 <root> <config> <postdate>2011-03-30</postdate> <location>84</location> <meal>07:36</meal> <checknumber>91339082011-03-30T07:36:12</checknumber> </config> <row> <descriptor>7297364</descriptor> <qty>1</qty> <price>33</price> <value>33</value> <recordtype>1</recordtype> <postdate>2011-03-30</postdate> <location>84</location> </row> <row> <descriptor>7794473</descriptor> <qty>1</qty> <price>60</price> <value>60</value> <recordtype>1</recordtype> <postdate>2011-03-30</postdate> <location>84</location> </row> <row> <id>13</id> <value>117.99</value> <recordtype>2</recordtype> <postdate>2011-03-30</postdate> <location>84</location> </row> <row> <id>2</id> <value>8.25</value> <recordtype>3</recordtype> <postdate>2011-03-30</postdate> <location>84</location> </row> </root> 
+4
source share
2 answers

This is a short and simple conversion :

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match= "node()[not(self::root or ancestor-or-self::config or ancestor-or-self::row)]"> <xsl:apply-templates/> </xsl:template> </xsl:stylesheet> 

when applied to the provided XML document:

 <root> <postdate>2011-03-30</postdate> <location>84</location> <meal>07:36</meal> <config> <postdate>2011-03-30</postdate> <location>84</location> <meal>07:36</meal> <checknumber>91339082011-03-30T07:36:12</checknumber> </config> <items> <row> <descriptor>7297364</descriptor> <qty>1</qty> <price>33</price> <value>33</value> <recordtype>1</recordtype> <postdate>2011-03-30</postdate> <location>84</location> </row> <row> <descriptor>7794473</descriptor> <qty>1</qty> <price>60</price> <value>60</value> <recordtype>1</recordtype> <postdate>2011-03-30</postdate> <location>84</location> </row> </items> <tenders> <row> <id>13</id> <value>117.99</value> <recordtype>2</recordtype> <postdate>2011-03-30</postdate> <location>84</location> </row> </tenders> <taxes> <row> <id>2</id> <value>8.25</value> <recordtype>3</recordtype> <postdate>2011-03-30</postdate> <location>84</location> </row> </taxes> </root> 

creates the desired, correct result:

 <root> <config> <postdate>2011-03-30</postdate> <location>84</location> <meal>07:36</meal> <checknumber>91339082011-03-30T07:36:12</checknumber> </config> <row> <descriptor>7297364</descriptor> <qty>1</qty> <price>33</price> <value>33</value> <recordtype>1</recordtype> <postdate>2011-03-30</postdate> <location>84</location> </row> <row> <descriptor>7794473</descriptor> <qty>1</qty> <price>60</price> <value>60</value> <recordtype>1</recordtype> <postdate>2011-03-30</postdate> <location>84</location> </row> <row> <id>13</id> <value>117.99</value> <recordtype>2</recordtype> <postdate>2011-03-30</postdate> <location>84</location> </row> <row> <id>2</id> <value>8.25</value> <recordtype>3</recordtype> <postdate>2011-03-30</postdate> <location>84</location> </row> </root> 

Explanation

  • Using and overriding an identity rule .

  • Proper use of the axis ancestor-or-self:: .

+6
source

I get it. This xslt works for me.

 <xsl:stylesheet version="1.0" exclude-result-prefixes="msxsl" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"> <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> <xsl:template match="/"> <root> <xsl:for-each select="//row"> <row> <xsl:apply-templates/> </row> </xsl:for-each> <xsl:for-each select="//config"> <config> <xsl:apply-templates/> </config> </xsl:for-each> </root> </xsl:template> <xsl:template match="*"> <xsl:element name="{name()}"> <xsl:value-of select="."/> </xsl:element> </xsl:template> </xsl:stylesheet> 
0
source

All Articles