RE: [xsl] Glossary Help

Subject: RE: [xsl] Glossary Help
From: "Shailesh Shinde" <shailesh@xxxxxxxxxxxx>
Date: Thu, 3 Aug 2006 19:46:52 +0530
Hi,

The below xsl code works fine and getting required output....but now I have
receive the xml file from client where the <p id="doe13"> contains so the
below xsl code is failing to match the cases......what needs to be done
here?


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
	<xsl:output method="xml" indent="yes"/>
	<xsl:preserve-space elements="*"/>
	<xsl:strip-space elements="*"/>
	<xsl:template match="node()|@*">
		<xsl:copy>
			<xsl:apply-templates select="@*|node()"/>
		</xsl:copy>
	</xsl:template>

<xsl:template match="division[(@type='appendix') and ((topic/title =
'Glossary') or  (topic/title = 'A'))]">
		<division>
			<xsl:copy-of select="@*"/>
			<xsl:for-each select="topic">
				<topic>
					<xsl:copy-of select="@*"/>
					<xsl:copy-of select="title"/>
					<xsl:apply-templates
select="body[ancestor::division[(@type='appendix')]]" mode="dogloss"/>
				</topic>
				</xsl:for-each>
					</division>
	</xsl:template>

	<xsl:template match="body[ancestor::division[(@type='appendix')]]"
mode="dogloss">
		<glosslist>
			<xsl:apply-templates select="p[not(text())]/i/b"
mode="dogloss"/>
			<xsl:apply-templates select="p[text()]/i/b"
mode="dogloss"/>
			<xsl:apply-templates select="p[not(text())]/b"
mode="dogloss"/>
			<xsl:apply-templates select="p[text()]/b"
mode="dogloss"/>
		</glosslist>
	</xsl:template>

	<xsl:template match="p[not(text())]/i/b" mode="dogloss">
	<glossdiv>
			<xsl:value-of select="."/>
		</glossdiv>
	</xsl:template>

	<xsl:template match="p[text()]/i/b" mode="dogloss">
		<glossentry>
			<glossterm>
				<xsl:value-of select="."/>
			</glossterm>
			<glossdef>
				<xsl:value-of select="../../text()"/>
			</glossdef>
		</glossentry>
	</xsl:template>
	
	<xsl:template match="p[not(text())]/b" mode="dogloss">
		<glossdiv>
			<xsl:value-of select="."/>
		</glossdiv>
	</xsl:template>

	<xsl:template match="p[text()]/b" mode="dogloss">
		<glossentry>
			<glossterm>
				<xsl:value-of select="."/>
			</glossterm>
				<glossdef>
				<xsl:value-of select="../text()"/>
			</glossdef>
			</glossentry>
	</xsl:template>
		</xsl:stylesheet>


Thanks,
Shailesh

-----Original Message-----
From: Mukul Gandhi [mailto:gandhi.mukul@xxxxxxxxx] 
Sent: Monday, July 31, 2006 10:02 PM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: [xsl] Glossary Help

On 7/31/06, Shailesh Shinde <shailesh@xxxxxxxxxxxx> wrote:

I have few comments..

       <xsl:preserve-space elements="*"/>
       <xsl:strip-space elements="*"/>

I think you may not need above. This seems to have no effect.

I think you can modify the below template as following:

       <xsl:template match="division[(@type='appendix') and
((topic/title = 'Glossary') or (topic/title = 'A'))]"> <!-- you can
add more or clauses -->
           <division>
               <xsl:copy-of select="@*"/>
               <xsl:for-each select="topic">
                  <topic>
                     <xsl:copy-of select="@*"/>
                     <xsl:copy-of select="title"/>
                     <!-- you may need to modify this as well -->
                     <xsl:apply-templates
select="body[ancestor::division[@type='appendix']]"/>
                  </topic>
               </xsl:for-each>
               <xsl:apply-templates/>
           </division>
       </xsl:template>

I guess I have given you lot of pointers to get started.

-- 
Regards,
Mukul Gandhi

http://gandhimukul.tripod.com

Current Thread