xsl-list
[Top] [All Lists]

RE: XSLT/Java does not identify an external Java class

2004-01-04 11:07:57
The code should work with Instant Saxon, but you need to make sure that
the classpath is set up as required by the Microsoft JVM. Since you are
writing your own Java code, you probably have the Sun JDK installed, in
which case I would recommend using full Saxon rather than instant Saxon.

Michael Kay

-----Original Message-----
From: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com 
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf Of 
Linc
Sent: 03 January 2004 15:07
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] XSLT/Java does not identify an external Java class


You are correct I am using Instant Saxon. In the book it says 
that the example should ork unchanged for Saxon or Xalan 
despite the "xml.apache.org/xslt" namespace and that it works 
because you use the processors' shortcut conventions for 
encoding Java class in the namespace.

I am not commited to any processor so I assume this should 
work with Xalan.


Linc


----- Original Message -----
From: "Michael Kay" <mhk(_at_)mhk(_dot_)me(_dot_)uk>
To: <xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com>
Sent: Saturday, January 03, 2004 8:39 PM
Subject: RE: [xsl] XSLT/Java does not identify an external Java class


Calling extension functions depends on which processor you 
are using, 
so you need to give us this information! It looks to me as 
if you are 
trying to run an example that was written for Xalan but using the 
Saxon processor. In fact, it looks as if you are using 
Instant Saxon, 
which means you are using the Microsoft JVM, which has 
quite different 
ways of managing the classpath from the Sun JVM.

The message means that the JVM didn't find the class on the 
classpath.

Michael Kay

-----Original Message-----
From: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf 
Of Linc
Sent: 03 January 2004 00:31
To: XSL-List(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] XSLT/Java does not identify an external Java class


Hi,

I am having difficulty getting an example working from the book 
'XSLT cookbook' by Sal Mangano, recipe 12.3 (page 542). I receive 
the following error for the SVG bounding box example on running 
"c:\my path...\saxon textWidthTest.xml textWidthTest.xslt > 
output.svg" at the CMD line: Error at xsl:value-of on line 17 of 
file:/c:/my path/textwidthtest.xslt:
  The URI xalan://com.ora.xsltckbk.util.SVGFontMetrics does not 
identify an external Java class Transformation failed: Run-time 
errors were reported

Here is the XLST and java file used:

XSLT file
------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns:xalan="http://xml.apache.org/xslt";
xmlns:font="xalan://com.ora.xsltckbk.util.SVGFontMetrics"
exclude-result-prefixes="font xalan">

<xsl:output method="xml"/>

<xsl:template match="/">
  <svg width="100%" height="100%">
    <xsl:apply-templates/>
   </svg>
</xsl:template>


<xsl:template match="text">
  <xsl:variable name="fontMetrics" select="font:new(@font, @size, 
boolean(@weight), boolean(@stytle))"/>
  <xsl:variable name="text" select="."/>
  <xsl:variable name="width" 
select="font:stringWidth($fontMetrics,
$text)"/>
  <xsl:variable name="height" 
select="font:stringHeight($fontMetrics,
$text)"/>
  <xsl:variable name="style">
    <xsl:if test="@style">
      <xsl:value-of select="concat('font-style:',@style)"/>
    </xsl:if>
  </xsl:variable>
  <xsl:variable name="weight">
    <xsl:if test="@weight">
      <xsl:value-of select="concat('font-weight:',@weight)"/>
    </xsl:if>
  </xsl:variable>
  <g 
style="font-family:{(_at_)font};font-size:{(_at_)size};{$style};{$weight}">
    <!-- Use the SVGFontMetrics info render a rectangle 
that is -->
    <!-- slightly bigger than the expected size of the text -->
    <!-- Adjust the y position based on the previous text 
size. -->
    <rect x="10"
          y="{sum(preceding-sibling::text/@size) * 2}pt"
          width="{$width + 2}"
          height="{$height + 2}"
          style="fill:none;stroke: black;stroke-width:0.5;"/>
    <!-- Render the text so it is cenetered in the rectangle -->
    <text x="11" y="{sum(preceding-sibling::text/@size) * 2 +
@size div 2 + 2}pt">
      <xsl:value-of select="."/>
    </text>
  </g>

</xsl:template>


</xsl:stylesheet>




Java class in package (xsltckbk.jar)
-----------------------------------------------

package com.ora.xsltckbk.util ;
import java.awt.* ;
import java.awt.geom.* ;
import java.awt.font.* ;
import java.awt.image.*;

public class SVGFontMetrics
{
  public SVGFontMetrics(String fontName, int size)
  {
    m_font = new Font(fontName, Font.PLAIN, size) ;
    BufferedImage bi
        = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
    m_graphics2D = bi.createGraphics() ;
  }

  public SVGFontMetrics(String fontName, int size, boolean bold, 
boolean
italic)
  {
    m_font = new Font(fontName, style(bold,italic) , size) ;
    BufferedImage bi
        = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
    m_graphics2D = bi.createGraphics() ;
  }

  public double stringWidth(String str)
  {
    FontRenderContext frc = m_graphics2D.getFontRenderContext();
    TextLayout layout = new TextLayout(str, m_font, frc);
    Rectangle2D rect = layout.getBounds() ;
    return rect.getWidth() ;
  }

  public double stringHeight(String str)
  {
    FontRenderContext frc = m_graphics2D.getFontRenderContext();
    TextLayout layout = new TextLayout(str, m_font, frc);
    Rectangle2D rect = layout.getBounds() ;
    return rect.getHeight() ;
  }

  static private int style(boolean bold, boolean italic)
  {
    int style = Font.PLAIN ;
    if (bold) { style |= Font.BOLD;}
    if (italic) { style |= Font.ITALIC;}
    return style ;
  }

  private Font m_font = null ;
  private Graphics2D m_graphics2D = null;
}




I have searched the http://www.mulberrytech.com/xsl/xsl-list
archives, and numerous other sites for the answer, edited the 
classpath to include "xsltckbk.jar" but to no avail.

Any help appreciated.



Linc



 XSL-List info and archive:  
http://www.mulberrytech.com/xsl/xsl-list



 XSL-List info and archive:  
http://www.mulberrytech.com/xsl/xsl-list





 XSL-List 
info and archive:  http://www.mulberrytech.com/xsl/xsl-list



 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list