Re: [xsl] Generating an index of terms in a TEI P5 book MS

Subject: Re: [xsl] Generating an index of terms in a TEI P5 book MS
From: "Charles Muller acmuller@xxxxxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Thu, 16 Jun 2016 03:12:47 -0000
Wendell,


Indeed it's necessary if you wish to do more than list the values. For example, count how many you have ...

<xsl:for-each-group select="//term[@xml:lang='zh'])" group-by=".">
   <xsl:sort select="."/>
     <p count="{count(current-group())}>
       <xsl:value-of select="current-grouping-key()"/>
       <xsl:text> </xsl:text>
     </p>
</xsl:for-each-group>


Thank you! This would certainly be an attractive enhancement.


But this present code is generating an error in my <oXygen/>

The error is indicated as being in the line

<xsl:value-of select="current-grouping-key()"/>

and the error message is

"The value of attribute "count" associated with an element type "p" must not contain the '<' character."

But the following seems to work:

<xsl:for-each-group select="//term[@xml:lang='zh']" group-by=".">
<xsl:sort select="."/>
<p>
<xsl:value-of select="current-grouping-key()"/>
<xsl:value-of select="count(current-group())"/>
<xsl:text> </xsl:text>
</p>
</xsl:for-each-group>




I.e., it generates this kind of output:


<p>d8ef1 </p> <p>d8ef!h6#1 </p> <p>d8ef9d>?1 </p> <p>d8ef3 </p> <p>d8ef f1 </p> <p>d8ef1 </p> <p>d8ef35 </p> <p>d8ef3d8-1 </p> <p>d8eg)f111 </p> <p>d8eg)f1i1 </p> <p>d8eg1 </p>


But now that you've introduced this, I realize that I can sort by frequency, using


<xsl:sort select="count(current-group())"/>


Great!



Chuck




It's a nice thing to show a workshop --

Cheers, Wendell


On Sun, Jun 12, 2016 at 8:43 AM, Charles Muller acmuller@xxxxxxxxxxxxxxx <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
On 6/12/2016 9:36 PM, Martin Honnen martin.honnen@xxxxxx wrote:

On 12.06.2016 14:33, Charles Muller acmuller@xxxxxxxxxxxxxxx wrote:


I wonder if there is a way to eliminate the doubled entries with XSLT?


As you seem to have access to XSLT 2.0, you could simply use

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xpath-default-namespace="http://www.tei-c.org/ns/1.0"; version="2.0">
     <xsl:template match="TEI">
         <html>
             <head/>
             <body>
         <xsl:for-each select="distinct-values(//term[@xml:lang='zh'])">
           <xsl:sort select="."/>
        <p><xsl:value-of select="."/><xsl:text> </xsl:text></p>
          </xsl:for-each>
             </body>
         </html>
     </xsl:template>
</xsl:stylesheet>




OK, I'll try this as well. The following also does the trick:


     <body>
    <xsl:for-each select="//term[@xml:lang='zh'][not(preceding::node()=.)] ">
           <xsl:sort select="."/>
           <p><xsl:apply-templates/><xsl:text> </xsl:text></p>
            </xsl:for-each>
      </body>


I deeply appreciate your help. This was the last piece I needed to do a demo of using TEI-XML + XSLT at an upcoming DH Workshop.

Regards,

Chuck


--------------------------- A. Charles Muller

Graduate School of Humanities and Sociology
Faculty of Letters
University of Tokyo
7-3-1 HongE
, BunkyE
-ku
Tokyo 113-8654, Japan

Office Phone: 03-5841-3735

Web Site: Resources for East Asian Language and Thought
http://www.acmuller.net

Twitter: @H_Buddhism






--

---------------------------
A. Charles Muller

Graduate School of Humanities and Sociology
Faculty of Letters
University of Tokyo
7-3-1 HongE
, BunkyE
-ku
Tokyo 113-8654, Japan

Office Phone: 03-5841-3735

Web Site: Resources for East Asian Language and Thought
http://www.acmuller.net

Twitter: @H_Buddhism

Current Thread