Несколько предупреждений PHP в XSLTProcessor :: importStylesheet ()

Ошибки:

Предупреждение: XSLTProcessor :: importStylesheet () [xsltprocessor.importstylesheet]: 
Неопределенная переменная в /transform.php в строке 24

Предупреждение: XSLTProcessor :: importStylesheet () [xsltprocessor.importstylesheet]: 
ошибка компиляции: файл /protocols.xsl строка 18 шаблона элемента в /transform.php на строке 24

Предупреждение: XSLTProcessor :: importStylesheet () [xsltprocessor.importstylesheet]: 
Не удалось скомпилировать предикат в /transform.php в строке 24

Предупреждение: XSLTProcessor :: importStylesheet () [xsltprocessor.importstylesheet]: 
Неопределенная переменная в /transform.php в строке 24

Предупреждение: XSLTProcessor :: importStylesheet () [xsltprocessor.importstylesheet]: 
Ошибка компиляции: файл /home6/oneninfi/public_html/craigfreeman/iphone/project1/protocols.xsl строка 22 шаблона элемента в /transform.php в строке 24

Предупреждение: XSLTProcessor :: importStylesheet () [xsltprocessor.importstylesheet]: 
Не удалось скомпилировать предикат в /transform.php в строке 24

Предупреждение: XSLTProcessor :: transformToXml () [xsltprocessor.transformtoxml]: 
Нет таблицы стилей, связанной с этим объектом в /transform.php в строке 35

PHP:

$xsl = new XSLTProcessor();
    $xsldoc = new DOMDocument();
    $xsldoc->load($_GET['xsl'].'.xsl'); // protocols.xsl
    $xsl->importStyleSheet($xsldoc); // LINE 24

    if(isset($_GET['sectionNumber']))
        $xsl->setParameter('', 'sectionNumber', $_GET['sectionNumber']);
    if(isset($_GET['protocolNumber']))
        $xsl->setParameter('', 'protocolNumber', $_GET['protocolNumber']);
    if(isset($_GET['entryNumber']))
        $xsl->setParameter('', 'entryNumber', $_GET['entryNumber']);

    $xmldoc = new DOMDocument();
    $xmldoc->load($_GET['xml'].'.xml');
    echo $xsl->transformToXML($xmldoc); // LINE 35

XSL:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name="protocolNumber"></xsl:param>
    <xsl:param name="sectionNumber"></xsl:param>
<xsl:output method="html" encoding="UTF-8"/>
<xsl:template match="page/section[@id=$sectionNumber]"> // LINE 18
    <xsl:apply-templates select="protocol[@id=$protocolNumber]"/>
</xsl:template>

<xsl:template match="protocol[@id=$protocolNumber]"> // LINE 22
  <h4>(<xsl:value-of select="$sectionNumber"/>.<xsl:value-of select="@id"/>)&nbsp;<xsl:value-of select="@title"/></h4>
    <!-- Applies templates to all child elements -->
    <ol><xsl:apply-templates/></ol>
</xsl:template>

<xsl:template match="start">
  <span class="start"><xsl:value-of select="@level" /></span>
</xsl:template>

<xsl:template match="stop">
  <span class="stop"><xsl:value-of select="@level" />&nbsp;STOP</span>
</xsl:template>

<xsl:template match="note">
  <span class="note"><span class="noteType"><xsl:value-of select="@title" /></span>:&nbsp;<xsl:value-of select="." /></span>
</xsl:template>

<xsl:template match="step">
   <li><span class="step"><xsl:value-of select="."/></span></li>
</xsl:template>

</xsl:stylesheet>

XML:

<?xml version="1.0" encoding="UTF-8"?>
<page type="Protocols">
    <section id="3" title="Adult Cardiac Life Support">
        <protocol id="0" title="Cardiac Arrest - General Procedures">
            <start level="All Levels"/>
                <step>Verify patient is pulseless and apneic.</step>
                <step>Initiate or continue CPR.  CPR is to be continued at all times, except during defibrillation and /or interruptions &lt; 10 sec for patient transfer.</step>
                <step>Assure airway patency and begin use of BVM.  Provide initial BLS airway management, including Oropharyngeal or Nasopharyngeal Airway.</step>
                <step>Apply AED or SAED if available.  If AED already in place, wait until current shock sequence completion to switch to another AED or manual monitor – may use previously applied patches if compatible with new unit.</step>
                <step>Follow prompts provided by AED/SAED device.</step>
                <step>Utilize ALS, or initiate timely transport toward ALS (ALS intercept or hospital if closer).  If ALS not available, no more than 3 shocks should be delivered at the scene.  Defibrillation should not be performed in a moving ambulance.</step>
                <step>Advise receiving hospital ASAP.</step>
            <stop level="EMT"/>
            <start level="EMT-I, CC &amp; P"/>
                <step>If AED/SAED not already applied, quick look using manual monitor and defibrillate PRN after CPR of at least 5 cycles (about 2 minutes).  Apply limb leads and pads in between shock sequences as appropriate.</step>
                <step>Obtain vascular access.</step>
                <step>Secure definitive airway.  If BLS airway is sufficient to maintain chest rise, continue until additional time or resources are available.  If unable to intubate, continue use of BLS airway adjuncts or use alternate airway device.<br/><br/>emove Bag Valve device whenever transferring patient, moving patient in and out of Ambulance, or other times 
when Bag Valve device may dislodge the device.<br/><br/>Reassess airway patency after any movement of patient.</step>
            <stop level="EMT-I" />
            <start level="EMT-CC &amp; P"/>
                <step>Give medications as listed in the following specific arrhythmia / dysrhythmia protocols. 
</step>
                <note title="NOTE">Should IV/IO access not be available, Epinephrine, Atropine, and Lidocaine may be administered via ETT under 
direct, on-line Medical Control.</note>
        </protocol></section></page>

PHP5 XML / XSL включен

Мысли? Что-нибудь очевидное ??

10.11.2009 20:34:06
Что $xsldoc->load($_GET['xsl'].'.xsl');возвращает?
Ivan Nevostruev 10.11.2009 20:46:51
Проверьте мой ответ для точного объяснения вашей проблемы.
user357812 25.11.2010 22:14:58
7 ОТВЕТОВ
РЕШЕНИЕ

Посмотрите на эту ошибку: Предупреждение: XSLTProcessor :: importStylesheet () [xsltprocessor.importstylesheet]: ошибка компиляции: файл /protocols.xsl строка 18 шаблон элемента в /transform.php на строке 24

В строке 18 у вас есть:

<xsl: template match = "page / section [@ id = $ sectionNumber ]"> // LINE 18

Где определен $ sectionNumber? PHP не может видеть это.

1
10.11.2009 21:08:03
<xsl: param name = "sectionNumber"> </ xsl: param> устанавливает параметр sectionNumber в XSL, передаваемый из PHP $ xsl-> setParameter ('', 'sectionNumber', $ _GET ['sectionNumber']); , Доступ к нему осуществляется в другом месте документа XSL с помощью вызова $ sectionNumber
cfree 10.11.2009 21:19:17
Ну, во всяком случае, он не видит этот параметр. Вот почему в сообщении об ошибке говорится: неопределенная переменная в /transform.php в строке 24
Alexandru Luchian 10.11.2009 21:28:57
Я согласен с вами, хотя думаю, что это результат того, что таблица стилей не была импортирована по какой-либо причине.
cfree 10.11.2009 21:31:07
Я смог воспроизвести проблему на моем компьютере. Я просто не передал никакой переменной / параметра. Таблица стилей не импортируется, поскольку переменные $ имеют нулевое значение, поэтому в таблице стилей это ошибка.
Alexandru Luchian 10.11.2009 21:59:31
Это не может быть ошибкой, XSL проверяет и отображает нормально, используя Javascript ... Я попытался вручную установить переменные внутри XSL (и не передавать переменные через PHP), и я получаю те же ошибки.
cfree 10.11.2009 22:35:23

Мне кажется, что $ _GET ['xsl'] пусто.

0
10.11.2009 20:39:46
Это не так. Когда я заменил переменную на «protocol.xsl» и « domain.com/protocols.xsl », я получил те же ошибки ...
cfree 10.11.2009 20:46:13

В вашем xsl есть ошибка. Когда вы загружаете его в XSLTProcessorобъект, происходит сбой. Поэтому вы не можете применить его в XML.

0
10.11.2009 20:54:58
Я так не думаю. Я не получаю никаких ошибок при просмотре xsl-файла непосредственно в браузере, и я могу получить xsl для преобразования xml с использованием Javascript (не будет работать на всех клиентах, т.е. попытка PHP).
cfree 10.11.2009 20:57:59

Одна из возможностей заключается в том, что процессор XSL действительно жалуется на то, что его &nbsp;не объявили как сущность. Попробуйте изменить тип документа на

<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp '&#160;'> ] >
2
10.11.2009 21:17:47
Хороший улов! Это на самом деле уже есть, я просто вырезать его, чтобы опубликовать здесь. Я не буду делать это в следующий раз ...
cfree 10.11.2009 21:26:38
Если это не так, то я подозреваю ошибку. Я загрузил ваш xsl дословно в Oxygen / XML, и пропавшая сущность была единственной проблемой. После исправления он проходит испытания на правильность формования.
Jim Garrison 10.11.2009 21:41:35
Конечно, я имел в виду ошибку в XSLTProcessor.importStyleSheet ().
Jim Garrison 10.11.2009 21:42:31
Спасибо за проверку. Да, это как-то связано с тем, как XSL обрабатывает в PHP. Я думаю, что это не нравится тестирование сравнения атрибутов (то есть: узел [@ id = $ параметр])
cfree 11.11.2009 18:36:26

у меня возникла та же проблема, кажется, проблема в XSLTProcessor, если вы вызываете XSL с параметром, определите параметр в `

<template match="/"><xsl:parameter name="whatever"/">

тогда вы можете позвонить xslt->setParameter, он выдает ошибки в журнале apache, но, похоже, работает!

1
18.01.2012 09:54:23

Та же проблема здесь. Я решил эту проблему, заключив узлы «xsl: if» в узлы «xsl: template». В вашем случае это даст:

<xsl:template match="page/section"> // LINE 18
    <xsl:if test="@id=$sectionNumber">
        <xsl:apply-templates select="protocol[@id=$protocolNumber]"/>
    </xsl:if>
</xsl:template>

<xsl:template match="protocol"> // LINE 22
    <xsl:if test="@id=$protocolNumber">
        <h4>(<xsl:value-of select="$sectionNumber"/>.<xsl:value-of select="@id"/>)&nbsp;<xsl:value-of select="@title"/></h4>
        <!-- Applies templates to all child elements -->
        <ol><xsl:apply-templates/></ol>
    </xsl:if>
</xsl:template>
1
25.11.2010 17:40:10

Ваша таблица стилей недопустима XSLT 1.0: вы не можете иметь ссылку на переменную / параметр в шаблоне

Вы можете использовать ссылку на переменную / параметр в шаблонах XSLT 2.0.

По предложению @abc вам нужно пройти этот тест внутри шаблона контента.

2
23.05.2017 12:01:26
Пару лет назад в версии libxml наши разработчики использовали разрешенные переменные в атрибуте match, но QA использовала более новую среду, которая не удалась. Попытка понять это удаленно была забавой.
grantwparks 13.02.2012 10:18:23