1
votes

I want to modify the XSLT 1.0 transform in the attached xsl file to generate an HTML version of the table coded in the XML file (also attached). The resulting HTML output file has to contain the table defined in the XML file with all of its content retained, with alternating rows of data assigned different background tints when rendered in a web browser. Also, the resulting HTML output has to be a valid XHTML 1.1, and must be generated in a single pass, i.e. run.bat is executed once. Please help me out. Thank you in advance, I really appreciate this!

XSL file:

<?xml version="1.0"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" xmlns:saxon="http://icl.com/saxon" xmlns:date="http://exslt.org/dates-and-times" extension-element-prefixes="saxon date" version="1.0">
  <xsl:output method="text" encoding="UTF-8" indent="no"/>
  <xsl:template match="Item">Hello world</xsl:template>
</xsl:transform>

XML file:

<?xml version="1.0" encoding="utf-8"?>
<Item TextType="BodyMatter" SchemaVersion="2.0" id="AaAF_Freelance_Test_1" DiscussionAlias="Discussion" SessionAlias="Chapter" SecondColour="Pantone326C" ThirdColour="Pantone2945C" FourthColour="Pantone272C" Logo="colour" Rendering="VLE Preview" Template="Wide_Margin_Reduced_A4_Unnumbered_new_design_v10_release1">
  <CourseCode>AaAF</CourseCode>
  <CourseTitle>Accessible and alternative formats</CourseTitle>
  <ItemID/>
  <ItemTitle>AaAF: Freelance XSLT test document 1</ItemTitle>
  <Unit>
    <UnitID/>
    <UnitTitle/>
    <ByLine/>
    <Session>
      <Title>Freelance XSLT test – constructing tables</Title>
      <Paragraph>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec quis elit sapien. Duis sit amet interdum lectus. Sed faucibus, mi quis dapibus consequat, nisi nunc semper erat, eu pretium enim urna porta diam. Suspendisse mi nisi, adipiscing in semper ac, viverra vitae nisl. Nulla facilisi. Nullam luctus porttitor velit, quis euismod dui commodo eu. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Mauris arcu est, rhoncus interdum bibendum vel, commodo et justo.</Paragraph>
      <Table>
        <TableHead>Table of analytical techniques</TableHead>
        <tbody>
          <tr>
            <th class="ColumnHeadLeft">Analytical technique</th>
            <th class="ColumnHeadLeft">Application</th>
          </tr>
          <tr>
            <td class="TableLeft">IR reflectography</td>
            <td class="TableLeft">Characterisation of painting techniques, in panel and wall paintings, through the identification of underdrawings; identification of undocumented interventions; characterisation of pigments.</td>
          </tr>
          <tr>
            <td class="TableLeft">FT-IR spectroscopy</td>
            <td class="TableLeft"><i>In situ</i> non-destructive identification of alterations on stones, mortars and metals, identification of pigments and binders in paintings; identification of undocumented restorations.</td>
          </tr>
          <tr>
            <td class="TableLeft">Raman spectroscopy</td>
            <td class="TableLeft"><i>In situ</i> non-destructive identification of alterations on stones, mortars and metals; identification of pigments in wall paintings. </td>
          </tr>
          <tr>
            <td class="TableLeft">XRF</td>
            <td class="TableLeft">Elemental analyses of stones, metals, wall and easel paintings, and other objects. </td>
          </tr>
          <tr>
            <td class="TableLeft">Vis-NIR spectroscopy</td>
            <td class="TableLeft">Colorimetric measurements and, possibly, identification of pigments. Measurement of possible colour changing after restoration.</td>
          </tr>
          <tr>
            <td class="TableLeft">UV-vis spectroscopy</td>
            <td class="TableLeft"><i>In situ</i> non-destructive identification of the presence of organic substances. </td>
          </tr>
          <tr>
            <td class="TableLeft">Fluorimetry</td>
            <td class="TableLeft"><i>In situ</i> detection of the distribution of organic molecules</td>
          </tr>
          <tr>
            <td class="TableLeft">Drilling resistance measurement </td>
            <td class="TableLeft">Hardness of rocks used for monuments and sculptures</td>
          </tr>
        </tbody>
      </Table>
    </Session>
  </Unit>
</Item>

run.bat file:

java -jar ou_saxon.jar -o output1.html input.xml convert.xsl
pause
1

1 Answers

2
votes

This transformation:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="/">
  <xsl:apply-templates select="/*/*/*/Table"/>
 </xsl:template>

 <xsl:template match="Table">
  <table>
       <xsl:apply-templates select="node()|@*"/>
  </table>
 </xsl:template>

 <xsl:template match="TableHead">
  <th><xsl:apply-templates select="node()|@*"/></th>
 </xsl:template>

 <xsl:template match="tr[not(th)][position() mod 2 = 1]">
  <tr class="odd">
    <xsl:apply-templates select="node()|@*"/>
  </tr>
 </xsl:template>

 <xsl:template match="tr[not(th)][position() mod 2 = 0]">
  <tr class="even">
    <xsl:apply-templates select="node()|@*"/>
  </tr>
 </xsl:template>
</xsl:stylesheet>

when applied on the provided XML document:

<Item TextType="BodyMatter" SchemaVersion="2.0" id="AaAF_Freelance_Test_1" DiscussionAlias="Discussion" SessionAlias="Chapter" SecondColour="Pantone326C" ThirdColour="Pantone2945C" FourthColour="Pantone272C" Logo="colour" Rendering="VLE Preview" Template="Wide_Margin_Reduced_A4_Unnumbered_new_design_v10_release1">
    <CourseCode>AaAF</CourseCode>
    <CourseTitle>Accessible and alternative formats</CourseTitle>
    <ItemID/>
    <ItemTitle>AaAF: Freelance XSLT test document 1</ItemTitle>
    <Unit>
        <UnitID/>
        <UnitTitle/>
        <ByLine/>
        <Session>
            <Title>Freelance XSLT test – constructing tables</Title>
            <Paragraph>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec quis elit sapien. Duis sit amet interdum lectus. Sed faucibus, mi quis dapibus consequat, nisi nunc semper erat, eu pretium enim urna porta diam. Suspendisse mi nisi, adipiscing in semper ac, viverra vitae nisl. Nulla facilisi. Nullam luctus porttitor velit, quis euismod dui commodo eu. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Mauris arcu est, rhoncus interdum bibendum vel, commodo et justo.</Paragraph>
            <Table>
                <TableHead>Table of analytical techniques</TableHead>
                <tbody>
                    <tr>
                        <th class="ColumnHeadLeft">Analytical technique</th>
                        <th class="ColumnHeadLeft">Application</th>
                    </tr>
                    <tr>
                        <td class="TableLeft">IR reflectography</td>
                        <td class="TableLeft">Characterisation of painting techniques, in panel and wall paintings, through the identification of underdrawings; identification of undocumented interventions; characterisation of pigments.</td>
                    </tr>
                    <tr>
                        <td class="TableLeft">FT-IR spectroscopy</td>
                        <td class="TableLeft">
                            <i>In situ</i> non-destructive identification of alterations on stones, mortars and metals, identification of pigments and binders in paintings; identification of undocumented restorations.
                        </td>
                    </tr>
                    <tr>
                        <td class="TableLeft">Raman spectroscopy</td>
                        <td class="TableLeft">
                            <i>In situ</i> non-destructive identification of alterations on stones, mortars and metals; identification of pigments in wall paintings. 
                        </td>
                    </tr>
                    <tr>
                        <td class="TableLeft">XRF</td>
                        <td class="TableLeft">Elemental analyses of stones, metals, wall and easel paintings, and other objects. </td>
                    </tr>
                    <tr>
                        <td class="TableLeft">Vis-NIR spectroscopy</td>
                        <td class="TableLeft">Colorimetric measurements and, possibly, identification of pigments. Measurement of possible colour changing after restoration.</td>
                    </tr>
                    <tr>
                        <td class="TableLeft">UV-vis spectroscopy</td>
                        <td class="TableLeft">
                            <i>In situ</i> non-destructive identification of the presence of organic substances. 
                        </td>
                    </tr>
                    <tr>
                        <td class="TableLeft">Fluorimetry</td>
                        <td class="TableLeft">
                            <i>In situ</i> detection of the distribution of organic molecules
                        </td>
                    </tr>
                    <tr>
                        <td class="TableLeft">Drilling resistance measurement </td>
                        <td class="TableLeft">Hardness of rocks used for monuments and sculptures</td>
                    </tr>
                </tbody>
            </Table>
        </Session>
    </Unit>
</Item>

produces the wanted, correct result:

<table>
   <th>Table of analytical techniques</th>
   <tbody>
      <tr>
         <th class="ColumnHeadLeft">Analytical technique</th>
         <th class="ColumnHeadLeft">Application</th>
      </tr>
      <tr class="odd">
         <td class="TableLeft">IR reflectography</td>
         <td class="TableLeft">Characterisation of painting techniques, in panel and wall paintings, through the identification of underdrawings; identification of undocumented interventions; characterisation of pigments.</td>
      </tr>
      <tr class="even">
         <td class="TableLeft">FT-IR spectroscopy</td>
         <td class="TableLeft">
            <i>In situ</i> non-destructive identification of alterations on stones, mortars and metals, identification of pigments and binders in paintings; identification of undocumented restorations.
                        </td>
      </tr>
      <tr class="odd">
         <td class="TableLeft">Raman spectroscopy</td>
         <td class="TableLeft">
            <i>In situ</i> non-destructive identification of alterations on stones, mortars and metals; identification of pigments in wall paintings. 
                        </td>
      </tr>
      <tr class="even">
         <td class="TableLeft">XRF</td>
         <td class="TableLeft">Elemental analyses of stones, metals, wall and easel paintings, and other objects. </td>
      </tr>
      <tr class="odd">
         <td class="TableLeft">Vis-NIR spectroscopy</td>
         <td class="TableLeft">Colorimetric measurements and, possibly, identification of pigments. Measurement of possible colour changing after restoration.</td>
      </tr>
      <tr class="even">
         <td class="TableLeft">UV-vis spectroscopy</td>
         <td class="TableLeft">
            <i>In situ</i> non-destructive identification of the presence of organic substances. 
                        </td>
      </tr>
      <tr class="odd">
         <td class="TableLeft">Fluorimetry</td>
         <td class="TableLeft">
            <i>In situ</i> detection of the distribution of organic molecules
                        </td>
      </tr>
      <tr class="even">
         <td class="TableLeft">Drilling resistance measurement </td>
         <td class="TableLeft">Hardness of rocks used for monuments and sculptures</td>
      </tr>
   </tbody>
</table>

Do note:

The transformation just adds a class attribute of "odd" or "even" to each tr. This assumes that a css file would also be referenced and it has the appropriate CSS properties defined for .odd and .even.

If this isn't the case, one would alter the transformation to generate direct formatting.

For example, we couldhave in the two templates, respectively:

  <tr bgcolor="white">

and

  <tr bgcolor="#87b1f1">

Finally, if we want the output to be in the XHTML namespace, we would further modufy the transformation like this:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns="http://www.w3.org/1999/xhtml">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="/">
  <xsl:apply-templates select="/*/*/*/Table"/>
 </xsl:template>

 <xsl:template match="*">
   <xsl:element name="{name()}" namespace="http://www.w3.org/1999/xhtml">
     <xsl:copy-of select="namespace::*"/>
       <xsl:apply-templates select="node()|@*"/>
   </xsl:element>
 </xsl:template>

 <xsl:template match="Table">
  <table>
       <xsl:apply-templates select="node()|@*"/>
  </table>
 </xsl:template>

 <xsl:template match="TableHead">
  <th><xsl:apply-templates select="node()|@*"/></th>
 </xsl:template>

 <xsl:template match="tr[not(th)][position() mod 2 = 1]">
  <tr bgcolor="white">
    <xsl:apply-templates select="node()|@*"/>
  </tr>
 </xsl:template>

 <xsl:template match="tr[not(th)][position() mod 2 = 0]">
  <tr bgcolor="#87b1f1">
    <xsl:apply-templates select="node()|@*"/>
  </tr>
 </xsl:template>
</xsl:stylesheet>

When the same XML document is processed with this transformation, the result is now in the XHTML namespace:

<table xmlns="http://www.w3.org/1999/xhtml">
   <th>Table of analytical techniques</th>
   <tbody>
      <tr>
         <th class="ColumnHeadLeft">Analytical technique</th>
         <th class="ColumnHeadLeft">Application</th>
      </tr>
      <tr bgcolor="white">
         <td class="TableLeft">IR reflectography</td>
         <td class="TableLeft">Characterisation of painting techniques, in panel and wall paintings, through the identification of underdrawings; identification of undocumented interventions; characterisation of pigments.</td>
      </tr>
      <tr bgcolor="#87b1f1">
         <td class="TableLeft">FT-IR spectroscopy</td>
         <td class="TableLeft">
            <i>In situ</i> non-destructive identification of alterations on stones, mortars and metals, identification of pigments and binders in paintings; identification of undocumented restorations.
                        </td>
      </tr>
      <tr bgcolor="white">
         <td class="TableLeft">Raman spectroscopy</td>
         <td class="TableLeft">
            <i>In situ</i> non-destructive identification of alterations on stones, mortars and metals; identification of pigments in wall paintings. 
                        </td>
      </tr>
      <tr bgcolor="#87b1f1">
         <td class="TableLeft">XRF</td>
         <td class="TableLeft">Elemental analyses of stones, metals, wall and easel paintings, and other objects. </td>
      </tr>
      <tr bgcolor="white">
         <td class="TableLeft">Vis-NIR spectroscopy</td>
         <td class="TableLeft">Colorimetric measurements and, possibly, identification of pigments. Measurement of possible colour changing after restoration.</td>
      </tr>
      <tr bgcolor="#87b1f1">
         <td class="TableLeft">UV-vis spectroscopy</td>
         <td class="TableLeft">
            <i>In situ</i> non-destructive identification of the presence of organic substances. 
                        </td>
      </tr>
      <tr bgcolor="white">
         <td class="TableLeft">Fluorimetry</td>
         <td class="TableLeft">
            <i>In situ</i> detection of the distribution of organic molecules
                        </td>
      </tr>
      <tr bgcolor="#87b1f1">
         <td class="TableLeft">Drilling resistance measurement </td>
         <td class="TableLeft">Hardness of rocks used for monuments and sculptures</td>
      </tr>
   </tbody>
</table>