Modify an XML Document Using XSLT

I'm trying to figure out if there is a way to modify an XML document using XSLT, or are there any other better approaches than XSLT?

Say I have xml:

<feed xmlns="http://www.w3.org/2005/Atom"> <id>http://libx.org/libx2/libapps</id> <entry> <id>http://libx.org/libx2/libapps/2</id> </entry> <entry> <id>http://libx.org/libx2/libapps/3</id> </entry> </feed> 

I would like to do the following:

  • Change channel: id (delete feed text: id)
  • Change record: id values, so the last value of the number after "/" remains.

The xml result should look something like this:

 <feed xmlns="http://www.w3.org/2005/Atom"> <id></id> <entry> <id>2</id> </entry> <entry> <id>3</id> </entry> </feed> 

Thanks Sony

+4
source share
2 answers

I am. XSLT 1.0 Solution:

This XSLT 1.0 transformation works with any URL without making any assumptions about all the URLs that occupy a common start substring:

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:x="http://www.w3.org/2005/Atom"> <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="x:feed/x:id/node()"/> <xsl:template match="x:entry/x:id/text()" name="eatSlashes"> <xsl:param name="pText" select="."/> <xsl:choose> <xsl:when test="not(contains($pText, '/'))"> <xsl:value-of select="$pText"/> </xsl:when> <xsl:otherwise> <xsl:call-template name="eatSlashes"> <xsl:with-param name="pText" select= "substring-after($pText, '/')"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet> 

when applied to the provided XML document :

 <feed xmlns="http://www.w3.org/2005/Atom"> <id>http://libx.org/libx2/libapps</id> <entry> <id>http://libx.org/libx2/libapps/2</id> </entry> <entry> <id>http://libx.org/libx2/libapps/3</id> </entry> </feed> 

required, the correct result is obtained :

 <feed xmlns="http://www.w3.org/2005/Atom"> <id/> <entry> <id>2</id> </entry> <entry> <id>3</id> </entry> </feed> 

II. XSLT 2.0 Solution :

 <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:x="http://www.w3.org/2005/Atom"> <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="x:feed/x:id/node()"/> <xsl:template match="x:entry/x:id/text()"> <xsl:sequence select="tokenize(.,'/')[last()]"/> </xsl:template> </xsl:stylesheet> 

when applied to the same XML document (above), the same correct result is obtained :

 <feed xmlns="http://www.w3.org/2005/Atom"> <id/> <entry> <id>2</id> </entry> <entry> <id>3</id> </entry> </feed> 
+4
source

My XSLT knowledge is not the best, but it seems to work:

 <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <xsl:template match="a:feed/a:id" xmlns:a="http://www.w3.org/2005/Atom"> <xsl:copy/> </xsl:template> <xsl:template match="a:entry/a:id" xmlns:a="http://www.w3.org/2005/Atom"> <xsl:copy><xsl:value-of select="substring-after(.,'http://libx.org/libx2/libapps/')"/></xsl:copy> </xsl:template> </xsl:stylesheet> 
0
source

All Articles