RE: Re: [xsl] how to translate XML with XHTML-formatted element to FO

Subject: RE: Re: [xsl] how to translate XML with XHTML-formatted element to FO
From: cknell@xxxxxxxxxx
Date: Thu, 14 Apr 2005 10:24:05 -0400
I remain puzzled over the idea that there are "escaped" HTML tags in your input XML file. They appear as ordinary HTML tags in my email. In order to proceed I will put this down to a different understanding of what "escaped" means. If I have misunderstood you, please clarify the matter further.

I have taken your input and output and written a stylesheet that will produce the expected output. Well, almost. In your input file you have the bold and italic tags nested in the Donald Duck entry, but they are not nested in the desired output you posted. I will assume that this is a typing error and go on to produce nested output as is suggested by the input document's structure.

Given all these caveats, this stylesheet produces what I think you want.

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; xmlns:fo="http://www.w3.org/1999/XSL/Format";>
  <xsl:output method="xml" indent="yes" encoding="UTF-8" />
  <xsl:strip-space elements="*" />

  <xsl:template match="/">
    <fo:flow flow-name="xsl-region-body">
      <xsl:apply-templates />
    </fo:flow>
  </xsl:template>

  <xsl:template match="BOOKS">
  <xsl:apply-templates />
  </xsl:template>

  <xsl:template match="BOOK">
    <fo:block>
      <fo:block space-before.optimum="1pt" space-after.optimum="2pt">
        <xsl:apply-templates />
      </fo:block>
    </fo:block>
  </xsl:template>

  <xsl:template match="AUTHOR">
    <fo:block>Author: <xsl:value-of select="." /></fo:block>
  </xsl:template>

  <xsl:template match="PRICE">
    <fo:block>Price : US$ <xsl:value-of select="." /></fo:block>
  </xsl:template>

  <xsl:template match="TITLE">
    <xsl:choose>
      <xsl:when test="child::*">
        <fo:block>Title : <xsl:apply-templates /></fo:block>
      </xsl:when>
      <xsl:otherwise>
        <fo:block>Title : <xsl:value-of select="." /></fo:block>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template match="b">
    <xsl:choose>
      <xsl:when test="child::*">
        <fo:inline font-weight="bold"><xsl:apply-templates /></fo:inline>
      </xsl:when>
      <xsl:otherwise>
        <fo:inline font-weight="bold"><xsl:value-of select="." /></fo:inline>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template match="i">
    <xsl:choose>
      <xsl:when test="child::*">
        <fo:inline font-style="italic"><xsl:apply-templates /></fo:inline>
      </xsl:when>
      <xsl:otherwise>
        <fo:inline font-weight="italic"><xsl:value-of select="." /></fo:inline>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>
-- 
Charles Knell
cknell@xxxxxxxxxx - email



-----Original Message-----
From:     Magic Finger <magic.finger@xxxxxx>
Sent:     Wed, 13 Apr 2005 08:46:07 +0100
To:       <ElektonikaMail@>
Cc:       <cknell@xxxxxxxxxx>
Subject:  Re: [xsl] how to translate XML with XHTML-formatted element to FO

Hello Charles,

the required output should be something like the following, where the
escaped HTML-tags (like the one for bold (<b>) and italic (<i>)
formatting) inside the <TITLE> element of input file should be
interpreted/translated as desired.

----------
OUTPUT:
----------
--- books.fo --->
  ...
  <fo:flow flow-name="xsl-region-body">
   <fo:block>
    <fo:block space-before.optimum="1pt" space-after.optimum="2pt">
     <fo:block>Author: Walt Disney</fo:block>
     <fo:block>Price : US$ 19.90</fo:block>
     <fo:block>Title : <fo:inline font-weight="bold">Donald Duck -
</fo:inline><fo:inline font-style="italic">The True
Story</fo:inline></fo:block>
    </fo:block>
    <fo:block space-before.optimum="1pt" space-after.optimum="2pt">
     <fo:block>Author: Matt Groening</fo:block>
     <fo:block>Price : US$ 25.00</fo:block>
     <fo:block>Title : <fo:inline font-weight="bold">Homer Simpson For
President</fo:inline></fo:block>
    </fo:block>
   </fo:block>
  </fo:flow>
  ...
<--- books.fo ---

---------
INPUT:
---------
 --- books.xml --->
 <BOOK>
   <AUTHOR>Walt Disney</AUTHOR>
   <PRICE>19.90</PRICE>
   <TITLE><b>Donald Duck - <i>The True
Story</i></b></TITLE>
 </BOOK>

 <BOOK>
   <AUTHOR>Matt Groening</AUTHOR>
   <PRICE>25.00</PRICE>
   <TITLE><b>Homer Simpson For President</b></TITLE>
 </BOOK>
   ...
 <--- books.xml ---

Best regards,
Maik

>
> You have shown us your input, now how about some idea of what the output 
> should be. I have read your post several times and I can't understand what 
> problem you are trying to solve.
>
> It may be that you need to process the document in stages or you may need 
> advice on constructing a template. I just can't understand what you need 
> using the information you have given.
> -- 
> Charles Knell
> cknell@xxxxxxxxxx - email

Current Thread