I have a XML file as following and I want to convert it into another XML file.
<body>
<outline text="A">
<outline text="Abelson, Harold" author="Harold Abelson" title="Struktur und Interpretation von Computerprogrammen. Eine Informatik-Einführung" publisher="Springer Verlag" isbn="3540520430" year="1991"/>
<outline text="Abrahams, Paul W." author="Paul W. Abrahams" title="Tex for the Impatient" publisher="Addison-Wesley Pub Co" isbn="0201513757" year="2000"/>
</outline>
<outline text="B">
<outline text="Bach, Fred" author="Fred Bach" title="UNIX Handbuch zur Programmentwicklung" publisher="Hanser Fachbuchverlag" isbn="3446151036"/>
<outline text="Bach, Maurice J." author="Maurice J. Bach" title="Design of the UNIX Operating System" publisher="Prentice Hall PTR" isbn="0132017997" year="1986"/>
</outline>
</body>
Here is XML format that I want to convert to
<list>
<books text="A">
<book>
<text>Abelson, Harold</text>
<author>Harold Abelson</author>
<title>Struktur und Interpretation von Computerprogrammen. Eine
Informatik-Einführung</title>
<publisher>Springer Verlag</publisher>
<isbn>3540520430</isbn>
<year>1991</year>
</book>
<book>
<text>Abrahams, Paul W.</text>
<author>Paul W. Abrahams</author>
<title>Tex for the Impatient</title>
<publisher>Addison-Wesley Pub Co</publisher>
<isbn>0201513757</isbn>
<year>2000</year>
</book>
</books>
<books text="B">
<book>
<text>Bach, Fred</text>
<author>Fred Bach</author>
<title>UNIX Handbuch zur Programmentwicklung</title>
<publisher>Hanser Fachbuchverlag</publisher>
<isbn>3446151036</isbn>
<year />
</book>
Here is my code
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml"/>
<xsl:template match="body">
<list> <xsl:apply-templates select="outline"/> </list>
</xsl:template>
<xsl:template match="outline">
<books text= "{@text}">
<book><xsl:apply-templates select="outline"/>
<text><xsl:value-of select="@text" /></text>
<author><xsl:value-of select="@author" /></author>
<title><xsl:value-of select="@title" /></title>
<publisher><xsl:value-of select="@publisher" /></publisher>
<isbn><xsl:value-of select="@isbn" /></isbn>
<year><xsl:value-of select="@year" /></year>
</book>
</books>
</xsl:template>
</xsl:stylesheet>
and here is the output of my code.
<list>
<books text="A">
<book>
<books text="Abelson, Harold">
<book>
<text>Abelson, Harold</text>
<author>Harold Abelson</author>
<title>Struktur und Interpretation von Computerprogrammen. Eine
Informatik-Einführung</title>
<publisher>Springer Verlag</publisher>
<isbn>3540520430</isbn>
<year>1991</year>
</book>
</books>
There are two extra elements in my output
<books text="Abelson, Harold">
<book>
as my knowledge this maybe caused by this line of code. I tried few different way, but didn’t work
<xsl:template match="outline">
<books text= "{@text}">
Additional Question:
If the original XML files contains title. How to eliminate the head and title. My current code produce “tmp” in the new XML file.
<opml version="1.0">
<head>
<title>tmp</title>
<expansionState></expansionState>
</head>
<body>
<outline text="A">
<outline text="Abelson, Harold" author="H
You were on the right track, but you need two
outlinetemplates – one for the top leveloutlines, and one for the childoutlines.Please replace your
outlinetemplate with these three:And if it can be safely assumed that the names of the attributes of the source document will match the names of the elements in the output document, you can replace that second template with these two shorter, more streamlined ones: