Использование XSLT document () для динамически генерируемого XML в PHP - PullRequest
2 голосов
/ 16 октября 2010

В моем XSLT-файле.Я использую document() функцию

<xsl:variable name="Publicity" select="document('./publicity.xml')" />

, и это работает, но если я пытаюсь связать PHP-скрипт, который генерирует XML динамически,

<xsl:variable name="Publicity" select="document('./publicity.php')" />

я получаю

Warning: XSLTProcessor::transformToXml() [xsltprocessor.transformtoxml]: file:///C:/wamp/www/XSLT/test.php:3: parser error : Start tag expected, '<' not found in ... on line ...

, которые состоят из < из <?php

Похоже, XSLTProcessor не запрашивает файл, как через HTTP-запрос, поэтому он не выполняется Apache / PHP.

Я знаю, что мог бы просто включить эту структуру XML в свой основной XML, но я пытаюсь избежать этого ... пока кто-нибудь не скажет мне, что другого пути нет.

Спасибо!

Ответы [ 4 ]

3 голосов
/ 16 октября 2010

Право, функция document () просто читает файл с диска, она не делает HTTP-запрос. Таким образом, PHP не выполняется.

Вы должны будете использовать URL вместо просто имени файла в качестве аргумента вашей функции document ().

<xsl:variable name="Publicity" 
     select="document('http://example.com/publicity.php')" />

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

1 голос
/ 15 июня 2012

Я добился успеха с помощью функции xslt document () и php, просто используя CURL для получения XML (статического или динамического). Так что мой URL-адрес относится к PHP-скрипту (прокси), который CURLs где-то XML-ресурс. Примерно так: получить XML-документ в формате RSS

<xsl:variable name="homeUrl" select="http://mydomain.tld/"/>
<xsl:variable name="xmlUrl" select="http://domain.tld/feed.rss"/>
<xsl:variable name="includeXML" select="document(concat($homeUrl,'api/proxy.php?url=',$xmlUrl))"/>

<xsl:for-each select="$includeXML/rss/channel/item">
    ...
1 голос
/ 19 июня 2011

Поскольку я наткнулся на этот пост с помощью известной поисковой системы, когда искал решение для подобной проблемы, вот что я обнаружил до сих пор. Моя цель состояла в том, чтобы получить файл layout.xml, содержащий некоторую разметку XHTML и заполнить его данными из дерева data.xml, сгенерированного PHP (но не сохраненного на диск) с помощью преобразований XSL.

Кажется, что вы не можете импортировать динамически сгенерированный XML непосредственно в ваш XSLT-файл, не сохранив его на диске или не включив в дерево XSL. Похоже, решение состоит в том, чтобы использовать два преобразования xsl в вашем data.xml:

  1. Создайте свой data.xml, который содержит ваши данные через php.
  2. Затем используйте XSL-преобразование, чтобы сгенерировать XML, который преобразует ваш data.xml в data.xsl (первое преобразование) - чтобы data.xsl был так структурирован, чтобы при необходимости применять свои данные к layout.xml (см. следующий шаг)
  3. Используйте этот data.xsl в файле layout.xml, чтобы заполнить его данными (второе преобразование).

Сообщение в блоге [хотя и на немецком языке], описывающее это более подробно, можно найти здесь: xsl als Templatesystem

Это может быть немного обманом, так как ваш data.xsl является вариантом вашего исходного XSL с включенной структурой данных. Однако это выглядит более элегантно, поскольку вы, вероятно, можете создать общий файл first-translation-xsl (который необходимо сохранить на диск только один раз) и использовать его повторно. Я пока не знаю, есть ли место для оптимизации, так как до сих пор я мало работал с XSLT.

0 голосов
/ 17 октября 2010

Если первый аргумент функция document() является относительным URI, это разрешается из base-uri второго аргумента.Если второго аргумента нет, то используется базовый URI таблицы стилей XSLT, содержащей вызов функции document().

Вот выдержка из спецификации W3C XSLT .:

"Ссылка на URI может быть относительной. Базовый URI (см. [3.2 Базовый URI]) узла во втором наборе узлов аргумента, который является первым в порядке документаиспользуется в качестве базового URI для преобразования относительного URI в абсолютный URI. Если второй аргумент опущен, то по умолчанию используется узел в таблице стилей, содержащий выражение, которое включает в себя вызов функции document.ссылка URI длины - это ссылка на документ, относительно которого разрешается ссылка URI, поэтому document ("") ссылается на корневой узел таблицы стилей; представление таблицы стилей в дереве точно такое же, как если бы документ XML, содержащийтаблица стилей была исходным исходным документом. "

Это хорошо работает, когда таблица стилей XSLT делаетs имеют URI (URL файла или http URL).Однако динамически генерируемая таблица стилей находится в памяти и не имеет базового URI.В этом случае относительный URI как первый и единственный аргумент функции document() не может быть разрешен успешно.

Решение состоит в том, чтобы предоставить полный (абсолютный) URI документа XML .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...