Subject: Re: [xsl] constructing an element with an element's content based on the content of sibling element From: Syd Bauman <Syd_Bauman@xxxxxxxxx> Date: Sun, 10 Jun 2012 22:01:48 -0400 |
I'm not entirely sure I understand the desired logic, but I think it's "when I process a <product>, identify it with a <controlfield> that has (as content) the ISBN13 if there is one, the ISBN10 if not". It would be easier to tell if you'd provide a complete well-formed test input file. In any case, I think the attached does what you want in a more XSLT-ish way. But it's worth noting that: > <xsl:choose> > <xsl:when test="not( WHATEVER )"> > STUFF > </xsl:when> > <xsl:otherwise></xsl:otherwise> > </xsl:choose> > > <xsl:choose> > <xsl:when test="WHATEVER"> > OTHERSTUFF > </xsl:when> > <xsl:otherwise></xsl:otherwise> > </xsl:choose> is the same as <xsl:choose> <xsl:when test="WHATEVER"> OTHERSTUFF </xsl:when> <xsl:otherwise> STUFF </xsl:otherwise> </xsl:choose> It would probably be a good idea to read the posting guidelines: http://www.mulberrytech.com/xsl/xsl-list/#posting In any case, here's one way to do what you want. There are definitely other ways, some probably better. <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:template match="/wrapper"> <wrapper> <xsl:apply-templates select="product"/> </wrapper> </xsl:template> <xsl:template match="product"> <xsl:choose> <xsl:when test="productidentifier/b221 = '15'"> <xsl:apply-templates select="productidentifier[b221='15']"/> </xsl:when> <xsl:otherwise> <xsl:apply-templates select="productidentifier[b221='02']"/> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="productidentifier[b221 eq '02']"> <controlfield tag="001"> <xsl:text>ISBN10=</xsl:text> <xsl:value-of select="b244"/> </controlfield> </xsl:template> <xsl:template match="productidentifier[b221 eq '15']"> <controlfield tag="001"> <xsl:text>ISBN13=</xsl:text> <xsl:value-of select="b244"/> </controlfield> </xsl:template> </xsl:stylesheet> > Hoping someone can point out my misunderstanding of the solution in > my transformation to the construction of an element, > <controlfield>, with a preferred ISBN and the use of a second ISBN > (13 characters vs. 10) if the preferred is unavailable; otherwise, > nothing. > > <productidentifier> > <b221>02</b221> > <b244>160542868X</b244> > </productidentifier> > <productidentifier> > <b221>03</b221> > <b244>9781605428680</b244> > </productidentifier> > <productidentifier> > <b221>15</b221> > <b244>9781605428680</b244> > </productidentifier> > > All of the product records have 3 productidentifiers with b221 > element values in the following order: 02, 03, 15. > > To test the element construction with the second ISBN (b221=02) if > the preferred ISBN (b221=15) is missing, I removed the > productidentifer with element b221=15 from the second product > record; I removed all productidentifiers from the third record. > > <xsl:for-each select="productidentifier"> > <xsl:variable name="isbn13"> > <xsl:choose> > <xsl:when test="b221='15'"> > <xsl:value-of select="b244"/> > </xsl:when> > <xsl:otherwise></xsl:otherwise> > </xsl:choose> > </xsl:variable> > <xsl:variable name="isbn10"> > <xsl:choose> > <xsl:when test="b221='02'"> > <xsl:value-of select="b244"/> > </xsl:when> > <xsl:otherwise></xsl:otherwise> > </xsl:choose> > </xsl:variable> > > <xsl:choose> > <xsl:when test="not(empty($isbn13))"> > <controlfield tag="001"> > <xsl:text>xyz</xsl:text><xsl:value-of select="$isbn13"/> > </controlfield> > </xsl:when> > <xsl:otherwise></xsl:otherwise> > </xsl:choose> > > <xsl:choose> > <xsl:when test="empty($isbn13)"> > <controlfield tag="001"> > <xsl:text>xyz</xsl:text><xsl:value-of select="$isbn10"/> > </controlfield> > </xsl:when> > <xsl:otherwise></xsl:otherwise> > </xsl:choose> > > </xsl:for-each> > > The results of the three records: > > record 1 > > <controlfield tag="001">xyz</controlfield> > <controlfield tag="001">xyz</controlfield> > <controlfield tag="001">xyz9781605428680</controlfield> > > record 2 > > <controlfield tag="001">xyz</controlfield> > <controlfield tag="001">xyz</controlfield> > > record 3 has the desired result of no controlfield tag=001 > > I am apparently not accounting for productidentifier/b221=03 but > have tried creating a similar variable which would result in an > empty string...have tried using exists()...not using > variables...but always get the same result.. > > hope the problem is clear...a little cross-eyed at this point.. > > any help would be greatly appreciated...
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] constructing an element with , Dana Pearson | Thread | Re: [xsl] constructing an element w, Dana Pearson |
[xsl] constructing an element with , Dana Pearson | Date | Re: [xsl] constructing an element w, Dana Pearson |
Month |