XSLT-преобразование DXL не работает

У меня есть следующий DXL (т.е. данные XML Lotus Notes):

<?xml version='1.0' encoding="ISO-8859-1"?>
<document xmlns='http://www.lotus.com/dxl' version='6.5' maintenanceversion='4.0'>
    <noteinfo>
        <created><datetime>20020225T160055,64-05</datetime></created>
    <updatedby><name>CN=John Doe/O=MyOrg</name></updatedby>
    </noteinfo>
 </document>

Я пытаюсь преобразовать DXL в HTML с помощью таблицы стилей XSLT, но полученный HTML не содержит никаких элементов данных. Я раньше не работал с данными DXL, и мой XSLT немного устарел, поэтому я не уверен, в чем проблема.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0">
    <xsl:template match="/">
        <html>
            <body>
                <h2>Submission</h2>
                <table border="1">
                        <tr>
                            <td>Create date:</td>
                            <td><xsl:value-of select="document/noteinfo[1]/created[1]/datetime[1]"/></td>
                        </tr>
                        <tr>
                            <td>Updated by:</td>
                            <td><xsl:value-of select="updatedby[1]/name[1]"/></td>
                        </tr>             
                </table>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

person b00kgrrl    schedule 12.10.2016    source источник
comment
Какую версию XSLT вы используете?   -  person Matt Hogan-Jones    schedule 12.10.2016
comment
В таблице стилей XSLT указана версия 2.0, поэтому я предположил, что это то, что я использую. Я использую инструмент OxygenXML, и он настроен на использование Saxon EE 9.6.   -  person b00kgrrl    schedule 12.10.2016
comment
Ах да, я только что заметил значение 2.0.   -  person Matt Hogan-Jones    schedule 12.10.2016


Ответы (1)


В исходном XML-коде объявлено пространство имен по умолчанию:

<document xmlns='http://www.lotus.com/dxl' version='6.5' maintenanceversion='4.0'>

Это означает, что вам нужно объявить его и использовать в XPath в таблице стилей:

   <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:my="http://www.lotus.com/dxl">

Затем вам нужно будет сослаться на него в XPath в XSLT:

<xsl:value-of select="my:document/my:noteinfo[1]/my:created[1]/my:datetime[1]"/>

Если вы используете XSLT 2.0, вы можете указать xpath-default-namespace="http://www.lotus.com/dxl" в разделе таблицы стилей.

Вот моя попытка с использованием объявления пространства имен:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0" xmlns:my="http://www.lotus.com/dxl">
    <xsl:template match="/">
        <html>
            <body>
                <h2>Submission</h2>
                <table border="1">
                        <tr>
                            <td>Create date:</td>
                            <td><xsl:value-of select="my:document/my:noteinfo[1]/my:created[1]/my:datetime[1]"/></td>
                        </tr>
                        <tr>
                            <td>Updated by:</td>
                            <td><xsl:value-of select="my:document/my:noteinfo[1]/my:updatedby[1]/my:name[1]"/></td>
                        </tr>             
                </table>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

Ваш XPath для Updated by ячейки был неправильным, поэтому я внес в него свои собственные исправления, чтобы получить значение из вашего образца XML.

person Matt Hogan-Jones    schedule 12.10.2016