Я использую C ++ версию Xalan 1.10 под Windows и пытаюсь создать файл Apache FOP из XML-документа.
Файлы довольно большие и сложные, но следующие примеры прекрасно иллюстрируют проблему:
Input.xml
<?xml version="1.0" encoding="utf-8"?>
<root-xml-element>
<MyElement name="Some text"/>
</root-xml-element>
Stylesheet.xsl
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="text" indent="no"/>
<xsl:template match="/">
<fo:root>
<xsl:text>(ROOT MATCHED)</xsl:text>
<xsl:apply-templates select="root-xml-element"/>
</fo:root>
</xsl:template>
<xsl:template match="root-xml-element">
<xsl:text>(ROOT ELEMENT MATCHED)</xsl:text>
<xsl:call-template name="MyTemplate"/>
</xsl:template>
<xsl:template name="MyTemplate">
<xsl:text>(MY TEMPLATE MATCHED)</xsl:text>
<fo:layout-master-set>
<fo:simple-page-master master-name="Master" page-width="29.7cm" page-height="21cm">
</fo:simple-page-master>
</fo:layout-master-set>
</xsl:template>
</xsl:transform>
Преобразование завершается без ошибок, но выводит неполный вывод:
Выходной файл из Xalan
(ROOT MATCHED)(ROOT ELEMENT MATCHED)(MY TEMPLATE MATCHED)
Как видите, в выходном файле нет тегов <fo:...>
.Шаблон, очевидно, применяется.
Когда я запускаю процессор .NET xslt для тех же файлов, я получаю ожидаемый вывод:
Выходной файл из .NET XSLTпроцессор
<?xml version="1.0" encoding="utf-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
(ROOT MATCHED)(ROOT ELEMENT MATCHED)(MY TEMPLATE MATCHED)
<fo:layout-master-set>
<fo:simple-page-master master-name="Master" page-width="29.7cm" page-height="21cm" />
</fo:layout-master-set>
</fo:root>
То же преобразование также работает при применении из версии Java Xalan (точно не знаю, какая именно).С другой стороны, исполняемый файл командной строки Xalan выдает тот же неполный вывод, так что, скорее всего, не мой код что-то напутает (или это так?).
Что здесь происходит?Есть идеи что проверить?