Re: [docbook-apps] include MathML files with the help of XSL

From
Bob Stayton <>
Date
2012-06-21T16:57:56+00:00
ID
01f301cd4fce$fe06fae0$6600a8c0@pazu
Thread
Re: [docbook-apps] include MathML files with the help of XSL


Hi,

That stylesheet works outside of the browser, so it 
seems to be an issue with how the browser loads and processes a 
stylesheet.  Can you get the browser to work without any stylesheet 
customization, using the stock DocBook XSL stylesheet (without MathML 
processing)?  I've never had much luck getting browsers to process the 
DocBook XSL stylesheets.

 

Bob Stayton
Sagehill Enterprises


 

 

  
----- Original Message ----- 

  
From: 
  Zoltán János 
  Jánosi 

  
To: Bob Stayton 

  
Cc:  
  

  
Sent: Thursday, June 21, 2012 5:45 
  AM

  
Subject: Re: [docbook-apps] include 
  MathML files with the help of XSL

  

It doesn't seem to work for me.
I had to put this line right 
  after the xls namespace declaration line.
Now it drops an "unknown 
  error".

To reproduce the error, follow these steps:

  
    
download the 3 attached files into one directory

    
extract the DocBook xslt files into a subdirectory called 
    "docbook-xsl-1.76.1"

    
open the file called "MathML_XSLT_teszt.xml" in a browser (I use 
    FireFox)

  
2012/6/20 Bob Stayton <>

  Hi Zoltán,
I assumed you were developing a 
    customization layer of DocBook XSL.  Your test stylesheet does not 
    import the DocBook XSL stylesheet, and so the templates matching on the 
    mathml elements are not available to the processor.  If you add this to 
    the top of your test stylesheet, it will work:

 <xsl:import 
    href=""/>

Now 
    the templates matching on mml:* are imported and can copy the MathML 
    elements through.
    

You also said:

    but in my files, there are no mml namespace 
    given.

But in your Eq_0005.xml file, you do 
    specify the MathML namespace on the <math> 
    element:

 <math xmlns="http://www.w3.org/1998/Math/MathML">

When 
    that file is opened by the document() function, that namespace is respected 
    and those mathml templates will be applied to those elements.
    

Bob Stayton
Sagehill Enterprises


----- Original Message ----- 
    From: Zoltán János Jánosi

To: 
Sent: 
    Wednesday, June 20, 2012 2:07 AM
    

    

Subject: Re: [docbook-apps] include MathML files with the 
    help of XSL

Here is my test setup:

DocBook 4.4 XML 
    file:

<?xml version='1.0' 
    encoding='UTF-8'?>
<?xml-stylesheet href="" 
    type="text/xsl"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML 
    V4.4//EN" "docbookV4.4/docbookx.dtd" []>
<book xmlns:xi="http://www.w3.org/2001/XInclude">
  
    <title/>
  <chapter>
      
    <title/>
      <para>
      
        <inlineequation id="Eq_0005">
      
            <inlinemediaobject>
    
                <imageobject>
  
                    <imagedata 
    fileref="math/Eq_0005.gif"/>
            
        </imageobject>
          
        </inlinemediaobject>
        
      </inlineequation>
      
    </para>
  </chapter>
</book>

The XSLT 
    file (HTML5_MathML.xsl):

<?xml version="1.0" 
    encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
    <xsl:output method="html" encoding="utf-8" indent="yes" 
    />

  <xsl:template match="inlineequation">
  
        <xsl:variable name="id" select="@id"/>
    
      <xsl:variable name="mathml" select="concat($id, 
    '.xml')"/>
      <xsl:apply-templates 
    select="document($mathml,.)/*"/>
  
    </xsl:template>

  <xsl:template match="/">
  
        <xsl:text 
    disable-output-escaping='yes'></xsl:text>
    
          <html>
          
        <body>
            
          <xsl:apply-templates/>
      
            </body>
        
      </html>
  
    </xsl:template>

</xsl:stylesheet>

MathML file 
    (Eq_0005.xml):

  <math xmlns="http://www.w3.org/1998/Math/MathML">
  
      <mrow>
      
    <msup><mi>a</mi><mn>2</mn></msup>
  
        <mo>+</mo>
      
    <msup><mi>b</mi><mn>2</mn></msup>
  
        <mo>=</mo>
      
    <msup><mi>c</mi><mn>2</mn></msup>
  
      </mrow>
  </math>

Expected 
    result:

<!doctype 
    html>
 <html>
 <head>
 <meta 
    charset="UTF-8">
 </head>
 <body>
  
    <math xmlns="http://www.w3.org/1998/Math/MathML">
  
      <mrow>
      
    <msup><mi>a</mi><mn>2</mn></msup>
  
        <mo>+</mo>
      
    <msup><mi>b</mi><mn>2</mn></msup>
  
        <mo>=</mo>
      
    <msup><mi>c</mi><mn>2</mn></msup>
  
      </mrow>
  
    </math>
 </body>
</html>

Obtained 
    result: (by opening the DocBook XML file in 
    FireFox)

<html>
<body> x ( t ) = R e [ A ⋅ e j ( ω 
    0 ⋅ t + Φ ) ] </body>
</html>

Problem 1:
All of the 
    MathML XML elements are missing.

Problem 2:
You wrote something 
    about DocBook MML template match and I couldn't really understand what 
    should I do with that:

    
      
        You might want to add some error checking to this 
          code. You can use
xsl:apply-templates here because the DocBook 
          stylesheets already have
templates matching on MathML elements, and 
          they just copy the elements
through to the output. In html/math.xsl 
          you will find:

<xsl:template match="mml:*"
xmlns:mml="http://www.w3.org/1998/Math/MathML">
<xsl:copy>
<xsl:copy-of 
          select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>

It 
    seems to me really usable (just copying the MathML objects), but in my 
    files, there are no mml namespace given.

2012/6/14 Zoltán János 
    Jánosi <>:

    OK, I'll do.

2012/6/14 Bob Stayton <>:

      OK.  If it works, please post your reply to the 
        mailing list so it gets into
the list archive.

Bob 
        Stayton
Sagehill Enterprises


----- Original Message 
        ----- From: "Zoltán János Jánosi" <>
To: "Bob Stayton" <>
Sent: Thursday, June 14, 2012 
        2:09 PM

Subject: Re: [docbook-apps] include MathML files with the 
        help of XSL

Thanx Bob, you are right about what I originally 
        wanted.
Thanx for the answer, soon I'll try it!

2012/6/14 Bob 
        Stayton <>:

        
I think the requestor wanted to do this without 
          modifying the XML files to
add the references to the MathML 
          files:

          dynamically pull in MathML files (by their 
          ID)

That's why he was trying to use 
          XInclude in XSL. However, XInclude cannot
be used inside an XSLT 
          stylesheet because XSLT processors do not recognize
it or process 
          it. The XInclude step is performed when the files are parsed
by the 
          XML parser, before the stylesheet sees the XML.

But a 
          stylesheet can use the XSLT document() function to open and 
          include
other content. Something like this would 
          work

<xsl:template 
          match="inlineequation">
<xsl:variable name="id" 
          select="@id"/>
<xsl:variable name="mathml" 
          select="concat($id, '.xml')"/>
<xsl:apply-templates 
          select="document($mathml,.)/*"/>
</xsl:template>

You 
          might want to add some error checking to this code. You can 
          use
xsl:apply-templates here because the DocBook stylesheets 
          already have
templates matching on MathML elements, and they just 
          copy the elements
through to the output. In html/math.xsl you will 
          find:

<xsl:template match="mml:*"
xmlns:mml="http://www.w3.org/1998/Math/MathML">
<xsl:copy>
<xsl:copy-of 
          select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>

Bob 
          Stayton
Sagehill Enterprises


----- Original Message 
          ----- From: Carlos Araya
To: Zoltán János Jánosi
Cc: 
Sent: 
          Wednesday, June 13, 2012 9:37 AM
Subject: Re: [docbook-apps] 
          include MathML files with the help of XSL

The first 
          thing I see is that you need to include the mathml namespace 
          in
your customization 
          layer

<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:mml="http://www.w3.org/1998/Math/MathML"
xmlns:xi="http://www.w3.org/2001/XInclude">

Elements 
          for the MathML namespace should be prefixed with the prefix 
          you
chose (mml in the case above). Same thing with the XIncllude 
          elements,
they
have to be on their own namespace 
          (xi)

Each ID has to be unique. Otherwise when inserting the 
          MathML equation the
XSLT processor will throw an error for 
          duplicate IDs

Using the code you provide below I would do 
          something like this:

<inlineequation 
          id="Eq_0005">
<inlinemediaobject>
<imageobject>
<imagedata 
          fileref="math/Eq_0005.gif"/>
</imageobject>
<textobject>
<xi:include 
          href=""http://docbook.org/tdg51/en/html/inlinemediaobject.html" 
          target=_blank>http://docbook.org/tdg51/en/html/inlinemediaobject.html) 
          so the order in
which you put them may be important.

Using 
          xincludes may also change the way in which you process 
          your
documents.
Look at Bob Stayton's book for how to 
          pre-process your document with
xincluded content (http://www.sagehill.net/docbookxsl/Xinclude.html)

On 
          Wed, Jun 13, 2012 at 1:52 AM, Zoltán János Jánosi <>
wrote:

Hi 
          all!

My question:
Is there any way (with XSLT) to 
          dynamically pull in MathML files (by their
ID) and put them into 
          the XML/HTML files?

The situation is the following:

I 
          have a DocBook 4.4 XML file with equation objects in it.
Every 
          equation object has a unique ID.
For every equation ID belongs to 2 
          files, one MathML 2.0 XML file and a
graphics version.
Both 
          filename is constructed from the equation ID+extension.
The 
          graphics version is linked by the imagedata tag.

The source 
          equation looks like this: (DocBook 
          4.4)
<para>
<inlineequation 
          id="Eq_0005">
<inlinemediaobject>
<imageobject>
<imagedata 
          fileref="math/Eq_0005.gif"/>
</imageobject>
</inlinemediaobject>
</inlineequation>
<para>

I'd 
          like to dynamically transform the equation object to include 
          the
MathML
version rather than the graphics version. I tried to 
          transform the DocBook
document into XHTML and HTML5, and use 
          xinclude to include the MathML XML
files, but didn't succeed 
          yet.
It should look something like this at the end: (I 
          think)
<p>
<math>
<mrow>
<mi>a</mi>
<mo>&InvisibleTimes;</mo>
<msup>
...
</math>
</p>

What 
          I have tried yet:
Here is a simple XSLT to get the equation 
          ID:
<?xml version="1.0" 
          encoding="UTF-8"?>
<xsl:stylesheet 
          version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output 
          method="html"/>
<xsl:template 
          match="inlineequation">
The ID of equation is <xsl:value-of 
          select="@id"/>
</xsl:template>
</xsl:stylesheet>

Then 
          I tried to use the xinclude and put into the XSLT but none of 
          them
seemed to work.

Any ideas appreciated.
Thanx in 
          advance!