Hi guys

I'm new to XSLT programming and the question I ask may appear very easy to you guys. Please help me out.

This is the XML code :

<book id="12345">

<title>A<caps>New Voyage</caps>:Africa</title>

<desc>abcdefgh ijklmnop</desc>

</book>

<book id="12346">

<title>A<caps>New Voyage</caps></title>

<see id="12345">ANV</see>

</book>

I have to display the title and the description of each <book>. Some books don't have desc but have references to other tags. The attribute 'id' of the <see> tag refers to the book's id i have to refer and retrieve the <desc> value of that book and display it.

Please help me out. Is this possible using XSLT. The XML file cannot be changed.

Thanks in advance.

Recommended Answers

All 6 Replies

This is easily done in XSLT. This transformation will take your input document and produce it. I slightly modified the input document so I could verify it was working correctly. It assume 1 thing however. There will never exist a book node that has both a "desc" node and a "see" node. this is will happen you'll have to adjust the logic for it to work correctly.

Input Document

<books>
	<book id="12345">
		<title>A<caps>New Voyage 1</caps>:Africa</title>
		<desc>abcdefgh ijklmnop</desc>
	</book>
	<book id="12346">
		<title>A<caps>New Voyage 2</caps></title>
		<see id="12345">ANV</see>
	</book>
</books>

XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output indent="yes" method="html"/>

	<xsl:template match="/">
		<html>
			<body>
				<table>
					<xsl:apply-templates select="books"/>
				</table>
			</body>
		</html>
	</xsl:template>

	<xsl:template match="books">		
		<xsl:apply-templates select="book"/>		
	</xsl:template>

	<xsl:template match="book">
		<tr>
			<xsl:apply-templates select="title"/>
			<xsl:apply-templates select="desc"/>
			<xsl:apply-templates select="see"/>
		</tr>
	</xsl:template>
	
	<xsl:template match="title" >
		<td>
			<xsl:value-of select="." />
		</td>
	</xsl:template>

	<xsl:template match="desc">
		<td>
			<xsl:value-of select="."/>
		</td>
	</xsl:template>

	<xsl:template match="see">
		<xsl:variable name="getid" select="@id"/>
		<td>
			<xsl:value-of select="//book[@id = $getid]/desc"/>
		</td>
	</xsl:template>
</xsl:stylesheet>

Output in HTML

<html>
  <body>
    <table>
      <tr>
        <td>ANew Voyage 1:Africa</td>
        <td>abcdefgh ijklmnop</td>
      </tr>
      <tr>
        <td>ANew Voyage 2</td>
        <td>abcdefgh ijklmnop</td>
      </tr>
    </table>
  </body>
</html>

wow. thats great. exactly wat i was looking for. thanks amillion for the help. guess i have a lot to learn

Is there any way we can display the text inside the <caps> tag in caps and all other text as it is ??? Thx .

Is there any way we can display the text inside the <caps> tag in caps and all other text as it is ??? Thx .

Its quite simple when we transform to HTML with CSS. The following code does it fine :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="html"/>

<xsl:template match="/">
<html>
<body>
<table>
<xsl:apply-templates select="books"/>
</table>
</body>
</html>
</xsl:template>

<xsl:template match="books">
<xsl:apply-templates select="book"/>
</xsl:template>

<xsl:template match="book">
<tr>
<xsl:apply-templates select="title"/>
<xsl:apply-templates select="desc"/>
<xsl:apply-templates select="see"/>
</tr>
</xsl:template>

<xsl:template match="title" >
<td>
<xsl:apply-templates/>
</td>
</xsl:template>

<xsl:template match="title/caps" >
<td>
<span style="font-variant: small-caps;">
<xsl:apply-templates/>
</span>
</td>
</xsl:template>


<xsl:template match="desc">
<td>
<xsl:apply-templates/>
</td>
</xsl:template>

<xsl:template match="see">
<xsl:variable name="getid" select="@id"/>
<td>
<xsl:value-of select="//book[@id = $getid]/desc"/>
</td>
</xsl:template>
</xsl:stylesheet>

Thanks to iceandrews and everyone who has taken his/her time to look at this post.

Is there any way we can display the text inside the <caps> tag in caps and all other text as it is ??? Thx .

Its quite simple when we transform to HTML with CSS. The following code does it fine :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output indent="yes" method="html"/>

	<xsl:template match="/">
		<html>
			<body>
				<table>
					<xsl:apply-templates select="books"/>
				</table>
			</body>
		</html>
	</xsl:template>

	<xsl:template match="books">		
		<xsl:apply-templates select="book"/>		
	</xsl:template>

	<xsl:template match="book">
		<tr>
			<xsl:apply-templates select="title"/>
			<xsl:apply-templates select="desc"/>
			<xsl:apply-templates select="see"/>
		</tr>
	</xsl:template>
	
	<xsl:template match="title" >
		<td>
			<xsl:apply-templates/>
		</td>
	</xsl:template>

	<xsl:template match="title/caps" >
		<td>
                        <span style="font-variant: small-caps;">
			<xsl:apply-templates/>
                        </span>
		</td>
	</xsl:template>


	<xsl:template match="desc">
		<td>
			<xsl:apply-templates/>
		</td>
	</xsl:template>

	<xsl:template match="see">
		<xsl:variable name="getid" select="@id"/>
		<td>
			<xsl:value-of select="//book[@id = $getid]/desc"/>
		</td>
	</xsl:template>
</xsl:stylesheet>

Thanks to iceandrews and everyone who has taken his/her time to look at this post.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.