Re: [xsl] tokenize

Subject: Re: [xsl] tokenize
From: "Michael Kay mike@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Wed, 12 Oct 2016 09:11:32 -0000
I can't see why you would expect anything different from what you are getting.
When you do

> <xsl:for-each select="tokenize(.,', ')">
>   <xsl:if test=".!=''">
>    <au><xsl:copy-of select="."/></au>
>   </xsl:if>
>  </xsl:for-each>

you are clearly outputting one <au> element for each token in the input, so I
can't see why you would expect multiple tokens to be concatenated in a single
<au> element.

I think that what you actually need to do here is positional grouping. If we
simplified the input so it read

<p>
  <r>Amanda</r>
  <r>Ganem</r>
  <r>, M.D.</r>
  <r><sup>1</sup</r>
  <r>, </r>
  <r>Elias P. Bonaros</r>
  etc...
</p>

Then your logic would be

<xsl:template match="p">
  <xsl:for-each-group select="r" group-ending-with="r[. = ', ']">
    <au>
      <xsl:value-of select="current-group()/text()"/>
    </au>
 </xsl:for-each-group>
</xsl:template>

Perhaps you can work out how to adapt this to your more complex input. (It
might even be worth writing your stylesheet in two phases: first get rid of
the needless complexity in the input data, then do the "business logic" on the
simplified XML).

Michael Kay
Saxonica

> On 12 Oct 2016, at 09:55, Joga Singh Rawat jrawat@xxxxxxxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> Hi Experts,
>
> I am not getting the Expected Output by following inputs. Any idea? Thanks
> in advance.
>
> Input
> <w:p>
>  <w:pPr><w:pStyle w:val="Authors0"/></w:pPr>
>  <w:r><w:t>Amanda
> </w:t></w:r><w:r><w:t>Ganem</w:t></w:r><w:r><w:t>,M.D.</w:t></w:r>
>  <w:r><w:rPr><w:vertAlign
> w:val="superscript"/></w:rPr><w:t>1,B6,*</w:t></w:r>
>  <w:r><w:t>, </w:t></w:r>
>  <w:r><w:t>Elias P. Bonaros,M.D.</w:t></w:r>
>  <w:r><w:rPr><w:vertAlign w:val="superscript"/></w:rPr><w:t>2</w:t></w:r>
>  <w:r><w:t>, Bibiana D</w:t></w:r>
>  <w:r><w:t>. Stephen</w:t></w:r>
>  <w:r><w:rPr><w:vertAlign w:val="superscript"/></w:rPr><w:t>3</w:t></w:r>
>  <w:r><w:t>, </w:t></w:r>
>  <w:r><w:t>J.H. Calderon Jr</w:t></w:r>
>  <w:r><w:rPr><w:vertAlign w:val="superscript"/></w:rPr><w:t>2</w:t></w:r>
>  <w:r><w:t>, J.H. Calderon</w:t></w:r>
>  <w:r><w:rPr><w:vertAlign w:val="superscript"/></w:rPr><w:t>5,6</w:t></w:r>
>  <w:r><w:t xml:space="preserve">, </w:t></w:r>
>  <w:r><w:t>W. WYAT Hoback</w:t></w:r>
>  <w:r><w:rPr><w:vertAlign w:val="superscript"/></w:rPr><w:t>4,6</w:t></w:r>
> </w:p>
>
> Xslt
> <xsl:template match="w:p">
>   <xsl:if test="w:pPr/w:pStyle/@w:val='Authors0'">
>    <aug>
>     <xsl:apply-templates select="*" mode="make-tokens"/>
>   </aug>
> </xsl:if>
> </xsl:template>
> <xsl:template match="*" mode="make-tokens">
>  <xsl:for-each select="tokenize(.,', ')">
>   <xsl:if test=".!=''">
>    <au><xsl:copy-of select="."/></au>
>   </xsl:if>
>  </xsl:for-each>
> </xsl:template>
> <xsl:template match="w:r[w:rPr/w:vertAlign/@w:val='superscript']"
> mode="make-tokens">
>  </xsl:variable>
>  <sup><xsl:value-of select="."/></sup>
> </xsl:template>
>
> Current output
>   <aug>
>      <au>Amanda </au>
>      <au>Ganem</au>
>      <au>,M.D.</au>
>      <sup>1,&amp;x00B6;,*</sup>
>      <au>Elias P. Bonaros,M.D.</au>
>      <sup>2</sup>
>      <au>Bibiana D</au>
>      <au>. Stephen</au>
>      <sup>3</sup>
>      <au>J.H. Calderon Jr</au>
>      <sup>2</sup>
>      <au>J.H. Calderon</au>
>      <sup>5,6</sup>
>      <au>W. WYAT Hoback</au>
>      <sup>4,6</sup>
>   </aug>
>
> Expected output
>   <aug>
>      <au>Amanda Ganem,M.D. <sup>1,&amp;x00B6;,*</sup></au>
>      <au>Elias P. Bonaros,M.D.<sup>2</sup></au>
>      <au>Bibiana D. Stephen<sup>3</sup></au>
>      <au>J.H. Calderon Jr<sup>2</sup></au>
>      <au>J.H. Calderon<sup>5,6</sup></au>
>      <au>W. WYAT Hoback<sup>4,6</sup></au>
>   </aug>

Current Thread