If you can use XSLT 2.0, this is an easy problem to solve. Here's how.
I made the following XML file from your sample input:
<?xml version="1.0" encoding="UTF-8"?>
<author>
<authorFname>John</authorFname><authorLname>Dai</authorLname>,
<authorDegree>MD</authorDegree>;
<authorFname>Jane</authorFname><authorMname>Austin</authorMname><authorLname
Smith</authorLname>
</author>
and wrote the following transform for it:
<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<out>
<xsl:for-each-group select="author" group-starting-with="authorFname">
<xsl:apply-templates select="current-group()"/>
</xsl:for-each-group>
</out>
</xsl:template>
<xsl:template match="authorFname">
<FirstName><xsl:value-of select="."/></FirstName>
</xsl:template>
<xsl:template match="authorMname">
<MiddleName><xsl:value-of select="."/></MiddleName>
</xsl:template>
<xsl:template match="authorLname">
<LastName><xsl:value-of select="."/></LastName>
</xsl:template>
<xsl:template match="authorDegree">
<Degree><xsl:value-of select="."/></Degree>
</xsl:template>
<!-- Note: The default template is handling the text nodes that contain
the punctuation -->
</xsl:stylesheet>
and got the following output (from Saxon 8):
<?xml version="1.0" encoding="UTF-8"?>
<out>
<FirstName>John</FirstName>
<LastName>Dai</LastName>, <Degree>MD</Degree>;
<FirstName>Jane</FirstName>
<MiddleName>Austin</MiddleName>
<LastName>Smith</LastName>
</out>
Jay Bryant
Bryant Communication Services
----- Original Message -----
From: <cchelius(_at_)agitraining(_dot_)com>
To: <xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com>
Sent: Tuesday, August 15, 2006 4:35 PM
Subject: [xsl] value-of select problem
I have included a snippet from my xslt that I am having difficulties with.
My source XML can contain several authors names but those names don't have
to contain a middle name. The problem with my xslt is that when an author
doesn't contain a middle name it will pull the middle name from the next
author after it. Obviously this is no good as it creates a name that is
incorrect. I'm not sure how to tell the xslt that if there is no middle
name not to grab <authorMname from the next author. Any ideas?
XML Code Sample:
<author><authorFname>John</authorFname>
<authorLname>Dai</authorLname>,
<authorDegree>MD</authorDegree>;
<authorFname>Jane</authorFname><authorMname>Austin</authorMname><authorLname
Smith</authorLname></author>
XSLT Sample:
<xsl:for-each select="Story/author/authorFname">
<!-- Adjusted to allow for multiple authors -->
<Author>
<FirstName>
<xsl:value-of select="."/>
</FirstName>
<MiddleName>
<xsl:value-of
select="following-sibling::authorMname[1]"/>
</MiddleName>
<LastName>
<xsl:value-of
select="following-sibling::authorLname[1]"/>
</LastName>
<Suffix>
<xsl:value-of
select="following-sibling::authorSuffix[1]"/>
</Suffix>
<Affiliation>
<xsl:value-of
select="following-sibling::authorAffiliation[1]"/>
</Affiliation>
</Author>
</xsl:for-each>
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail:
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--