XSLTProcessor :: importStylesheet()中的多个PHP警告

时间:2009-11-10 20:34:07

标签: php xml xslt

错误:

Warning: XSLTProcessor::importStylesheet() [xsltprocessor.importstylesheet]: 
Undefined variable in /transform.php on line 24

Warning: XSLTProcessor::importStylesheet() [xsltprocessor.importstylesheet]: 
compilation error: file /protocols.xsl line 18 element template in /transform.php on line 24

Warning: XSLTProcessor::importStylesheet() [xsltprocessor.importstylesheet]: 
Failed to compile predicate in /transform.php on line 24

Warning: XSLTProcessor::importStylesheet() [xsltprocessor.importstylesheet]: 
Undefined variable in /transform.php on line 24

Warning: XSLTProcessor::importStylesheet() [xsltprocessor.importstylesheet]: 
compilation error: file /home6/oneninfi/public_html/craigfreeman/iphone/project1/protocols.xsl line 22 element template in /transform.php on line 24

Warning: XSLTProcessor::importStylesheet() [xsltprocessor.importstylesheet]: 
Failed to compile predicate in /transform.php on line 24

Warning: XSLTProcessor::transformToXml() [xsltprocessor.transformtoxml]: 
No stylesheet associated to this object in /transform.php on line 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

思考?有什么明显的吗?

7 个答案:

答案 0 :(得分:2)

一种可能性是XSL处理器真的抱怨&nbsp;没有被声明为实体。尝试将doctype更改为

<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp '&#160;'> ] >

答案 1 :(得分:2)

您的样式表无效XSLT 1.0:模式中没有变量/参数引用

您可以在XSLT 2.0模式中使用变量/参数引用。

根据@abc的建议,您需要在内容模板中传递该测试。

答案 2 :(得分:1)

看看这个错误: 警告:XSLTProcessor :: importStylesheet()[xsltprocessor.importstylesheet]:编译错误:第24行/transform.php中的文件/protocols.xsl第18行元素模板

在第18行,你有:

&lt; xsl:template match =“page / section [@ id = $ sectionNumber ]”&gt; // LINE 18

$ sectionNumber定义在哪里? PHP无法看到它。

答案 3 :(得分:1)

我遇到了同样的问题,如果你用一个参数调用一个XSL,在XSLTProcessor中似乎是一个问题,在`

上定义参数
<template match="/"><xsl:parameter name="whatever"/">

然后你可以调用xslt->setParameter,它会在apache日志中出错,但它似乎有效!

答案 4 :(得分:1)

这里的问题相同。 我通过在'xsl:template'节点中包含'xsl:if'节点来解决它。 在你的情况下,它给出了:

<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>

答案 5 :(得分:0)

在我看来$ _GET ['xsl']是空的。

答案 6 :(得分:0)

你的xsl有错误。将其加载到XSLTProcessor对象时,它会失败。因此,您无法将其应用于xml。