Re: [xsl] Bibliography author repetition handling

Subject: Re: [xsl] Bibliography author repetition handling
From: "Wendell Piez wapiez@xxxxxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Mon, 9 Oct 2017 15:35:25 -0000
Eliot didn't I say "you might prefer a mode"? :-)

Just to remark I agree with your proposal to prefer modes over
parameters for this kind of thing -- most of the time.

This is a case where the only difference between the two pathways over
bibl contents are identical except for a single element ... since
bibl/* includes a lot, that means a fair amount of 'mode overhead' to
handle the single difference.

For that reason I might be willing to put up with an xsl:choose here,
or functional equivalent ...

<xsl:template match="bibl/author[1]">
  <xsl:param name=brepeatb tunnel=byesb select=bfalse()b/>
  <xsl:apply-templates mode="repeating" select=".[$repeat]"/>
  <xsl:if test="not($repeat)">
     ...
  </xsl:if>
</xsl:template>

(Okay, I might leave a comment to help.)

Cheers, Wendell

On Mon, Oct 9, 2017 at 11:13 AM, Eliot Kimber ekimber@xxxxxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
> No argument with Wendellbs general solution, just one small coding style
twiddle:
>
> Instead of this:
>
>        <xsl:apply-templates select="current-group() except .">
>           <xsl:with-param tunnel="yes" name="repeat" select="true()"/>
>        </xsl:apply-templates>
>
> I would probably use a distinct mode for the repeated items:
>
>        <xsl:apply-templates select="current-group() except ."
mode=brepeated-bib-itemsb/>
>
> Ibve come to accept that preferring templates and modes over passing state
is the best XSLT style.
>
> All the items that have no difference in behavior in the two modes can
simply match in both modes:
>
> <xsl:template match=bbiblb mode=b#default repeated-bib-itemsb>
>   <xsl:apply-templates mode=b#current-modeb/>
> </xsl:template>
>
> Otherwise therebs going to have to be a choose instruction to check the
brepeatb parameter:
>
> <xsl:template b&>
>   <xsl:param name=brepeatb tunnel=byesb select=bfalse()b/>
>  <xsl:choose>
>    <xsl:when test=b$repeatb>
>      b&
>   </xsl:when>
>   <xsl:otherwise>
>     b&
>   </xsl:otherwise>
> </choose>
> </xsl:template>
>
> Better to put the choice in the mode and/or match expression.
>
> Cheers,
>
> E.
> --
> Eliot Kimber
> http://contrext.com
>
>
>
> On 10/9/17, 9:58 AM, "Wendell Piez wapiez@xxxxxxxxxxxxxxx"
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
>     Hi,
>
>     I think Chuck wants group-adjacent.
>
>     Chuck, what Martin is hinting is that rather than testing each bibl
>     (each as you match it) to see whether it is a "repeat" or not, you
>     first group all the bibls by their (analytic) author, then every
>     member of the group after the first is a repeat.
>
>     (Define "repeat" as "bibl that should get '----' instead of a lead
>     author's name by virtue of its having the same lead author as its
>     immediate predecessor".)
>
>     This means that most of your groups will have only one member, but
>     once in a while (when authors are repeated in runs) you will have a
>     group of two or even more members, only the first of which is not a
>     repeat.
>
>     Due to a design quirk in XSLT (semantics of "." inside groups), you
>     can code this fairly elegantly:
>
>     <xsl:for-each-group select="bibl" group-adjacent="gimme-author()">
>        <!-- apply templates to the first member -->
>        <xsl:apply-templates select=".">
>        <!-- apply templates to the rest w/ a param -->
>        <xsl:apply-templates select="current-group() except .">
>           <xsl:with-param tunnel="yes" name="repeat" select="true()"/>
>        </xsl:apply-templates>
>     </xsl:for-each-group>
>
>     Notes:
>
>     * No element is created for the group since the grouping is only to
>     sort them into categories.
>
>     * gimme-author() will be whatever XPath (path or other expression)
>     indicates the value to be grouped on (i.e. the leading author name
>     however normalized).
>
>     * inside the group, "." refers only to the first member of the group,
>     so "current-group() except ." returns all the others.
>
>     * Leaving it to you to figure out what to do at the receiving end with
>     the Boolean parameter $repeat ... although I've indicated
>     "tunnel='yes'" to leave another clue as to how it might be done. Or
>     instead of a parameter you could also use a mode here to distinguish
>     between handling the normal cases and the repeat cases. (Presumably
>     they are the same except for how they treat that author.)
>
>     * group-by will have a similar effect to group-adjacent but only if
>     the nodes are already in their final sorted order; if there is some
>     anomaly in the listing, group-adjacent is more robust (and will
>     reflect that anomaly not reorder around it).
>
>     It's been a few days, so you may already have tackled this. Still it's
>     a fun little problem.
>
>     Cheers, Wendell
>
>
>
>     On Wed, Oct 4, 2017 at 4:18 AM, Martin Honnen martin.honnen@xxxxxx
>     <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>     > Am 04.10.2017 um 08:25 schrieb Charles Muller
acmuller@xxxxxxxxxxxxxxx:
>     >>
>     >> In a TEI <biblStruct> bibliography that uses
biblStruct/*/author/surname
>     >> (etc), I have managed to write the code that checks if the author
name in
>     >> the prior <biblStruct> is the same, in which case the output is ---.
rather
>     >> than the author's name. It works fine, but I'm running into a problem
where
>     >> there the first author name is the same as that of the prior
<biblStruct>
>     >> entry, but there are also multiple authors, in which case the full
name
>     >> should be printed out.
>     >>
>     >> I thought that one way I might resolve this is to test if the number
of
>     >> authors in the prior entry is the same as this one, but I can't get
it to
>     >> work. I also don't know if this is even the best way of handling
this. The
>     >> XML is like this:  (present output here:
>     >> http://www.acmuller.net/articles-shisou.html)
>     >
>     >
>     > To me this sounds like a grouping problem where you want to group
your
>     > biblStruct elements with a composite key mad up of analytic/author, I
am not
>     > sure whether you want group-adjacent or group-by.
>     >
>     >
>
>
>
>     --
>     Wendell Piez | http://www.wendellpiez.com
>     XML | XSLT | electronic publishing
>     Eat Your Vegetables
>     _____oo_________o_o___ooooo____ooooooo_^
>
>
>
>



--
Wendell Piez | http://www.wendellpiez.com
XML | XSLT | electronic publishing
Eat Your Vegetables
_____oo_________o_o___ooooo____ooooooo_^

Current Thread