[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

XSL stylesheet issue - part 2 (newbie)

Subject: XSL stylesheet issue - part 2 (newbie)
From: "Frank Dissinger frank.dissinger@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Mon, 21 Oct 2024 13:54:06 -0000
 XSL stylesheet issue - part 2 (newbie)
Hi again,



I am stuck again. The next and last step in my XSL script is to create the
hyperlinked TOC entries for all elements with an ID attribute that starts with
the characters btocrefb. With the help of AI, I added some XSL templates.
The script is supposed to create a TOC like this:

<p class=btoclev1b><a href=b#tocref-cx34gb>Heading on level 1</a></p>

<p class=btoclev2b><a href=b#tocref-df38db>Heading on level 2</a></p>

<p class=btoclev3b><a href=b#tocref-f8op7b>Heading on level 3</a></p>



What the script actually does is adding the unique btocref-b&b IDs to the
headings, but it does not create the hyperlinked TOC entries.



Below is the script. I have attached an HTML file which shows an example of
the script output.



Again a namespace issue?



Any help is greatly appreciated!



<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xpath-default-namespace="http://www.w3.org/1999/xhtml"
  xmlns:xhtml="http://www.w3.org/1999/xhtml"
  version="3.0">

  <!-- Output settings for XHTML -->
  <xsl:output
    method="html"
    encoding="UTF-8"
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
    indent="yes"/>

  <!-- Identity template to copy all elements and attributes -->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <!-- Adding a unique ID attribute using generate-id() to headings to create
hyperlink targets for the TOC -->
  <xsl:template
    match="*[@id='rn_release_notes']//h2 | *[@id='rn_release_notes']//h3 |
*[@id='rn_release_notes']//p[@class='rn_heading']">
    <xsl:copy>
      <!-- Generating a unique ID for each element -->
      <xsl:attribute name="id">
        <xsl:text>tocref-</xsl:text>
        <xsl:value-of select="generate-id()"/>
      </xsl:attribute>
      <!-- Copy the remaining attributes except "id", and apply templates to
children -->
      <xsl:apply-templates select="@*[name() != 'id']"/>
      <xsl:apply-templates select="node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- Template to generate the TOC -->
  <xsl:template match="div[@id='rn_toc']">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:apply-templates select="h1"/>

      <!-- Insert the TOC after the <h1> element -->
      <xsl:for-each select="//*[@id[starts-with(., 'tocref')]]">

        <xsl:variable name="level">
          <xsl:choose>
            <xsl:when test="self::h2">1</xsl:when>
            <xsl:when test="self::h3">2</xsl:when>
            <xsl:when test="self::p[@class='rn_heading']">3</xsl:when>
          </xsl:choose>
        </xsl:variable>

        <xhtml:p class="toclev{level}">
          <xhtml:a href="#{ <mailto:#{./@id}> ./@id}">
            <xsl:value-of select="."/>
          </xhtml:a>
        </xhtml:p>

      </xsl:for-each>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>





Freundliche GrC<Ce | Best regards

Frank Dissinger

Documentation Manager

..........................................

CGS ORIS GmbH

Email  <mailto:frank.dissinger@xxxxxxxxxxxx> frank.dissinger@xxxxxxxxxxxx |
Web  <http://www.cgs-oris.com/> www.cgs-oris.com

Address Kettelerstrasse 24 | 63512 Hainburg | Germany

Phone +49 6182 9626-0 | Fax +49 6182 9626-99

Commercial register Offenbach, HRB no. 21495

Managing directors Bernd RC<ckert, Christoph Thommessen



Von: Frank Dissinger <frank.dissinger@xxxxxxxxxxxx
<mailto:frank.dissinger@xxxxxxxxxxxx> >
Gesendet: Montag, 21. Oktober 2024 13:12
An: xsl-list@xxxxxxxxxxxxxxxxxxxxxx <mailto:xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
Betreff: XSL stylesheet issue (newbie)



Hi Martin,



I have added the bxpath-default-namespaceb attribute and now the script
indeed produces the expected result.



Thank you very much for your great help!



The XSL element looks like this now:



<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0"
  xpath-default-namespace="http://www.w3.org/1999/xhtml" >



BTW: I had to change the XSL version from 1.0 to 2.0 in the XSL element,
otherwise Oxygen would use Saxon 6.5.5 for validation, which does not support
the xpath-default-namespace atttribute. Now it uses "Saxon-PE 12.3" and the
validation error message disappears.



I found out that I can also change this to bversion=3.0b. The script would
still run without any problems and validation issues.



Freundliche GrC<Ce | Best regards

Frank Dissinger

Documentation Manager

..........................................

CGS ORIS GmbH

Email  <mailto:frank.dissinger@xxxxxxxxxxxx> frank.dissinger@xxxxxxxxxxxx |
Web  <http://www.cgs-oris.com/> www.cgs-oris.com

Address Kettelerstrasse 24 | 63512 Hainburg | Germany

Phone +49 6182 9626-0 | Fax +49 6182 9626-99

Commercial register Offenbach, HRB no. 21495

Managing directors Bernd RC<ckert, Christoph Thommessenb

Von: Martin Honnen martin.honnen@xxxxxx <mailto:martin.honnen@xxxxxx>
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx
<mailto:xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> >
Gesendet: Donnerstag, 17. Oktober 2024 19:52
An: xsl-list@xxxxxxxxxxxxxxxxxxxxxx <mailto:xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
Betreff: Re:  XSL stylesheet issue (newbie)



On 17/10/2024 19:41, Martin Honnen  <mailto:martin.honnen@xxxxxx>
martin.honnen@xxxxxx wrote:

The stylesheet below is supposed to add a unique 'id' attribute named
'tocref001', 'tocref002' etc. to all <h2>, <h3> and <p class="rn_heading">
elements which are descendants of an element with an 'id' attribute named
'rn_release_notes'. The script runs without any errors, but does not add any
IDs.

The sample input has e.g.

  html xmlns= <http://www.w3.org/1999/xhtml> "http://www.w3.org/1999/xhtml"

meaning it has elements in the XHTML namespace, if you use an XSLT 2 or 3
processor like Saxon Java, SaxonJS, SaxonC or Saxon.NET you can add

  xpath-default-namespace= <http://www.w3.org/1999/xhtml>
"http://www.w3.org/1999/xhtml"

on your xsl:stylesheet element in the XSLT code and your match

<!-- Adding id=toc001 attributes to headings to create hyperlink targets for
the TOC -->
<xsl:template match="*[@id='rn_release_notes']//h2 |
*[@id='rn_release_notes']//h3 |
*[@id='rn_release_notes']//p[@class='rn_heading']">

will match XHTML elements.

With more recent version of Saxon (11, 12 at least, I think) you could also
use your original stylesheet code but add the command line option

  -ns:##html5

for execution

[demime 1.01d removed an attachment of type image/png which had a name of image001.png]

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.