2014-10-17 3 views
1

Я использую преобразование XSLT 1.0 с использованием Delphi/MSXML. XSLT идет какЧто можно сделать, если преобразование XSLT с использованием msxml не соответствует корневому узлу ('/')?

<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> 

и XML books.xml будет определить, как

<?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> 

Когда я запускаю этот XSLT transformation using Delphi/MSXML, он не выводит ничего.

Saxon, для справки, дает следующий результат (1,0/2,0 предупреждение не входит в комплект):

<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> 

Что я могу делать с XML (XSLT это не для меня, чтобы изменить), чтобы дать тот же результат, что и в Саксоне?

ответ

3

Попробуйте выполнить преобразование с помощью узлов документа; изменить в original code эту строку:

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

к:

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

Если вы Явно вызвать transformNode на documentElement узле, то это меня не удивляет, что match="/" не будет применена.

+0

Спасибо Мартину! Это потрясающе - я действительно ценю это! :) Одно примечание: документация Delphi для класса реализации [TXMLDocument] (http://docwiki.embarcadero.com/Libraries/XE6/en/Xml.XMLDoc.TXMLDocument_Properties) говорит: «DocumentElement предоставляет доступ к корневому узлу XML-документ «while» Node предоставляет доступ к узлу документа для XML-документа, который я считаю немного запутанным. – conciliator

Смежные вопросы