@LastDragon

Как выполнить произвольный PHP скрипт во время XSL преобразования?

Дано


  1. XML документ, содержащий ссылки на документы в каком-либо формате:
    <?xml version="1.0" encoding="UTF-8"?>
    <project>
        <documentation path="/path/to/file.textile" type="textile"/>
        <documentation path="/path/to/file.html" type="html"/>
    </project>
    	
  2. PHP скрипт, который используется для преобразования документов в HTML
  3. XSLT стиль для преобразования XML документа в HTML документ
  4. Ant скрипт который используется для запуска XSL трансформации

Вопрос


Как при трансформации XML документа заменить все <documentation/> на соответствующий им HTML? (т.е. в результирующем документе должен оказаться результат выполнения PHP скрипта, которому в качестве параметров были переданы путь к файлу и его формат)

Варианты решения


  1. Добавить протокол php и в XSLT использовать, например, document('php:....')
  2. Двойная трансформация: (1) создаем html/php документ, в котором теги <documentation/> заменены на вызов скрипта; (2) выполняем созданный документ

(1) более предпочтительный, но как реализовать непонятно.

Ограничения


  1. Мультиплатформенность
  2. Использование только «локальных» данных (т.е. использовать http:// нельзя)
  • Вопрос задан
  • 3629 просмотров
Решения вопроса 1
@LastDragon Автор вопроса
Возможно, кому то будет интересно — проблема решилась написанием расширения для xslt процессора и его добавлением в стиль (написано на java, для конвертации текста используется org.eclipse.mylyn.wikitext)

Пример класса:
package ru.lastdragon.ipb.toolkit.xslt;

public final class Converter {
    public static String toHtml(String path) {
        // .....
    }
}

Пример стиля:
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:converter="ru.lastdragon.ipb.toolkit.xslt.Converter"
    extension-element-prefixes="converter"
    exclude-result-prefixes="converter">
    <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes" />
    
    <xsl:template match="/">
        <xsl:value-of select="converter:toHtml('path/to/file.textile')"/>
    </xsl:template>
</xsl:stylesheet>

Если кому-то понадобится, код можно будет найти (если успею сегодня закомичу) в репозитории проекта IPB3 Toolkit (toolkit) (лицензия GPLv3).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@usetester
По варианту решения 1 смотрите www.php.net/manual/en/book.stream.php
Ответ написан
yadeveloper
@yadeveloper
Делаете «apply-template» на «documentation».

В самом шаблоне же — используете следующий функционал: ua.php.net/manual/en/xsltprocessor.registerphpfunctions.php
Ответ написан
cyberklin
@cyberklin
идея такая:
1. зарегистрировать свою функцию в xslt, которая будет по узлу documentation возвращать содержимое
2. изменить XSLT стиль из пункта 3, чтобы он перед использованием прогонял узлы documentation через нашу функцию.

если бы xslt трансформация запускалась бы не ant, а, к примеру, php скриптом то такой трюк легко можно было бы сделать через registerPHPFunctions ( ru2.php.net/manual/en/xsltprocessor.registerphpfunctions.php )

может можно модифицировать схему на такую, что ant запускает просто php cli-скрипт, который и сделает трансформацию? тогда все решается через registerPHPFunctions
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы