1

I'm running an XSLT 1.0 transformation using Delphi/MSXML. The XSLT goes like

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:lh="http://localhost" 
                version="1.0">

    <xsl:output method="html" omit-xml-declaration="yes" indent="yes" encoding="ISO-8859-1" />

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

    <xsl:template match="/">
        <html>
            <body>
                <h2>My Book Collection</h2>
                <table border="1">
                    <tr>
                        <th>Author</th>
                        <th>Title</th>
                    </tr>
                    <xsl:for-each select="lh:library/lh:book">
                        <tr>
                            <td><xsl:value-of select="@author"/></td>
                            <td><xsl:value-of select="."/></td>
                        </tr>
                    </xsl:for-each>
                </table>
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>

and the XML books.xml is define as

<?xml version="1.0" encoding="UTF-8"?>
<library xmlns="http://localhost">
    <book author="Michael Howard">Writing Secure Code</book>
    <book author="Michael Kay">XSLT Reference</book>
</library>

When I run this XSLT transformation using Delphi/MSXML, it doesn't output anything.

Saxon, for reference, yields the following result (1.0/2.0 warning message not included):

<html xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:lh="http://localhost">
   <body>
      <h2>My Book Collection</h2>
      <table border="1">
         <tr>
            <th>Author</th>
            <th>Title</th>
         </tr>
         <tr>
            <td>Michael Howard</td>
            <td>Writing Secure Code</td>
         </tr>
         <tr>
            <td>Michael Kay</td>
            <td>XSLT Reference</td>
         </tr>
      </table>
   </body>
</html>

What can I do about the XML (the XSLT is not really for me to change) to give the same output as in Saxon?

Community
  • 1
  • 1
conciliator
  • 6,078
  • 6
  • 41
  • 66

1 Answers1

3

Try to run the transformation with the document nodes; change in the original code this line:

XML.DocumentElement.TransformNode(XSL.DocumentElement, Result)

to:

XML.Node.TransformNode(XSL.Node, Result)

If you explictly call the transformNode on the documentElement node then it does not surprise me that the match="/" does not get applied.

Community
  • 1
  • 1
Martin Honnen
  • 160,499
  • 6
  • 90
  • 110
  • Thanks Martin! That's awesome - I truely appreciate it! :) One a side note: the Delphi documentation for the implementing class [TXMLDocument](http://docwiki.embarcadero.com/Libraries/XE6/en/Xml.XMLDoc.TXMLDocument_Properties) says 'DocumentElement provides access to the root node of the XML document' while 'Node provides access to the document node for the XML document', which I find slightly confusing. – conciliator Oct 21 '14 at 08:38