- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在更新我的脚本以将我们的代码从 Ubuntu 12.04 (PHP 5.3.10) 移动到 Ubuntu 14.04 (PHP 5.5.9),但是 $result = $proc->transformToXml($xml);
一直返回 NULL,我不知道为什么。
如前所述,这曾经在 Ubuntu 12.04 中工作,并且根据(我能找到的)关于所用类(DomDocument、XSLTProcessor)的不同 PHP 版本之间没有变化。
如何让 $result
包含正确解析的 XML 输出?
这是我的 PHP 代码:
$xml = new DomDocument();
$xml->loadXML($xml_file_contents, LIBXML_NOERROR);
$xml->normalizeDocument(); //Whether included or left out doesn't seem to make a difference
$xsl = new DomDocument();
$xsl->loadXML($xsl_file_contents);
$proc = new XSLTProcessor();
$proc->importStylesheet($xsl);
$result = $proc->transformToXml($xml);
XML:
<vac:body>
<vac:kanaal type="generiek">
<vac:vraag>Lorem Ipsum dolar sit amet</vac:vraag>
<vac:antwoord
xmlns="http://www.w3.org/1999/xhtml">
<vac:antwoordTekst/>
<vac:antwoordTekstErvoor/>
<vac:antwoordTekstOrigineel/>
<vac:antwoordTekstErna/>
<vac:antwoordProductVeld>
<![CDATA[<p>Lorem Ipsum dolar sit amet</p>]]>
</vac:antwoordProductVeld>
<vac:antwoordAdres/>
</vac:antwoord>
<vac:toelichting
xmlns="http://www.w3.org/1999/xhtml">
<![CDATA[]]>
</vac:toelichting>
<vac:onderwaterantwoord>
<vac:onderwaterantwoordTekst/>
<vac:onderwaterantwoordProductVeld/>
</vac:onderwaterantwoord>
<vac:formulieren/>
<vac:contactinfo/>
</vac:kanaal>
<vac:verwijzingProduct resourceIdentifier="1337">Lorem ipsum</vac:verwijzingProduct>
<vac:verwijzingVac resourceIdentifier="1337-01">Lorem Ipsum dolar sit amet</vac:verwijzingVac>
<vac:verwijzingVac resourceIdentifier="1337-02">Lorem ipsum dolar sit amet</vac:verwijzingVac>
</vac:body>
还有 XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" />
<xsl:template match="/">
<xsl:call-template name="text">
<xsl:with-param name="node" select="/body/kanaal/antwoord/antwoordTekst" />
</xsl:call-template>
<xsl:call-template name="text">
<xsl:with-param name="node" select="/body/kanaal/antwoord/antwoordProductVeld" />
</xsl:call-template>
<xsl:call-template name="address">
<xsl:with-param name="node" select="/body/kanaal/antwoord/antwoordAdres" />
</xsl:call-template>
<xsl:if test="/body/kanaal/verwijzingOverigeInfo" >
<ul>
<xsl:for-each select="/body/kanaal/verwijzingOverigeInfo" >
<xsl:call-template name="moreinfo">
<xsl:with-param name="node" select="self::node()" />
</xsl:call-template>
</xsl:for-each>
</ul>
</xsl:if>
</xsl:template>
<xsl:template name="text">
<xsl:param name="node" />
<xsl:if test="normalize-space($node/text())">
<xsl:value-of select="$node"/>
</xsl:if>
</xsl:template>
<xsl:template name="address">
<xsl:param name="node" />
<xsl:for-each select="$node/instantie">
<p class="vac_address">
<xsl:for-each select="*">
<xsl:call-template name="address_element"/>
</xsl:for-each>
</p>
</xsl:for-each>
</xsl:template>
<xsl:template name="address_element">
<xsl:if test=". != ''">
<xsl:element name="span">
<xsl:attribute name="class">
<xsl:value-of select ="name(.)"/>
</xsl:attribute>
<xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:element>
</xsl:if>
</xsl:template>
<xsl:template name="moreinfo">
<xsl:param name="node" />
<li>
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="$node/@resourceIdentifier" />
</xsl:attribute>
<xsl:value-of select="$node" />
</xsl:element>
</li>
</xsl:template>
</xsl:stylesheet>
最佳答案
您在错误的位置寻找问题。它与 PHP 无关。 PHP 只使用 libxml2,您最好求助于 xsltproc 来检查问题所在。运行:
xsltproc test.xsl test.xml
基本上是SISO的经典案例。 XSLT 只是返回了恰好为 NULL 的操作的正确结果。你为什么要问?这是您遇到的一系列问题:
PS:请帮自己一个忙,使用<?xml version="1.0" encoding="utf-8"?>
在您的 XML 中。否则你最终会遇到编码问题。
PPS:关于您的评论,根据“PHPDoc 意味着它成功加载了 XML”。成功加载并不意味着您的 XML 是正确的。您收到“<nodename>
上的命名空间前缀 vac 未在实体中定义”是有充分理由的。
这里是正确的 XML:
<?xml version="1.0" encoding="utf-8"?>
<vac:body xmlns:vac="http://standaarden.overheid.nl/vac">
<vac:kanaal type="generiek">
<vac:vraag>Lorem Ipsum dolar sit amet</vac:vraag>
<vac:antwoord
xmlns="http://www.w3.org/1999/xhtml">
<vac:antwoordTekst>show me!</vac:antwoordTekst>
<vac:antwoordTekstErvoor/>
<vac:antwoordTekstOrigineel/>
<vac:antwoordTekstErna/>
<vac:antwoordProductVeld>
<![CDATA[<p>Lorem Ipsum dolar sit amet</p>]]>
</vac:antwoordProductVeld>
<vac:antwoordAdres/>
</vac:antwoord>
<vac:toelichting
xmlns="http://www.w3.org/1999/xhtml">
<![CDATA[]]>
</vac:toelichting>
<vac:onderwaterantwoord>
<vac:onderwaterantwoordTekst/>
<vac:onderwaterantwoordProductVeld/>
</vac:onderwaterantwoord>
<vac:formulieren/>
<vac:contactinfo/>
</vac:kanaal>
<vac:verwijzingProduct resourceIdentifier="1337">Lorem ipsum</vac:verwijzingProduct>
<vac:verwijzingVac resourceIdentifier="1337-01">Lorem Ipsum dolar sit amet</vac:verwijzingVac>
<vac:verwijzingVac resourceIdentifier="1337-02">Lorem ipsum dolar sit amet</vac:verwijzingVac>
</vac:body>
和正确的 XSL:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:vac="http://standaarden.overheid.nl/vac">
<xsl:output method="xml" omit-xml-declaration="yes" />
<xsl:template match="/">
<xsl:call-template name="text">
<xsl:with-param name="node" select="/vac:body/vac:kanaal/vac:antwoord/vac:antwoordTekst" />
</xsl:call-template>
<xsl:call-template name="text">
<xsl:with-param name="node" select="/vac:body/vac:kanaal/vac:antwoord/vac:antwoordProductVeld" />
</xsl:call-template>
<xsl:call-template name="address">
<xsl:with-param name="node" select="/vac:body/vac:kanaal/vac:antwoord/vac:antwoordAdres" />
</xsl:call-template>
<xsl:if test="/vac:body/vac:kanaal/vac:verwijzingOverigeInfo" >
<ul>
<xsl:for-each select="/vac:body/vac:kanaal/vac:verwijzingOverigeInfo" >
<xsl:call-template name="moreinfo">
<xsl:with-param name="node" select="self::node()" />
</xsl:call-template>
</xsl:for-each>
</ul>
</xsl:if>
</xsl:template>
<xsl:template name="text">
<xsl:param name="node" />
<xsl:if test="normalize-space($node/text())">
<xsl:value-of select="$node/text()"/>
</xsl:if>
</xsl:template>
<xsl:template name="address">
<xsl:param name="node" />
<xsl:for-each select="$node/vac:instantie">
<p class="vac_address">
<xsl:for-each select="*">
<xsl:call-template name="address_element"/>
</xsl:for-each>
</p>
</xsl:for-each>
</xsl:template>
<xsl:template name="address_element">
<xsl:if test=". != ''">
<xsl:element name="span">
<xsl:attribute name="class">
<xsl:value-of select ="name(.)"/>
</xsl:attribute>
<xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:element>
</xsl:if>
</xsl:template>
<xsl:template name="moreinfo">
<xsl:param name="node" />
<li>
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="$node/@resourceIdentifier" />
</xsl:attribute>
<xsl:value-of select="$node" />
</xsl:element>
</li>
</xsl:template>
</xsl:stylesheet>
<vac:antwoordTekst>show me!</vac:antwoordTekst>
因为空元素的样式返回 NULL。只是为了展示一些东西。这些文件的结果是:
show me!
<p>Lorem Ipsum dolar sit amet</p>
关于PHP XSLTProcessor transformToXml 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32559892/
我有这个 XSLT img { width: 100% } Ci sono elemen
这个问题在这里已经有了答案: Fatal error: Class 'XSLTProcessor' not found (2 个答案) 关闭 8 年前。 我正在尝试使用 XSLT 将 XML 文件转
这是我的问题:我正在尝试使用 XSLTProcessor 将 xml 转换为 html。我已经阅读了它的使用,但我有以下问题 - transformToXML(xml_file) 函数要求 xml_f
我想得到转换错误。 这是我的代码: var xsltProcessor = new XSLTProcessor(); xsltProcessor.importStylesheet(xsl); var
我有一个加载 500 mb xml 文件并使用 xsl 模板解析该文件的页面。解析器在我的本地环境中完美运行。我正在使用 WAMP。 在网络服务器上。 警告:DOMDocument::load() [
出于某种原因,我无法让 XSLTProcessor() 一直工作。 这是我的 JS: ... xsltProcessor = new XSLTProcessor(); xsltProcessor.im
我尝试复制示例 Transforming XML to XHTML in the Browser ,但我在控制台中的 xsltProcessor.importStylesheet(xsl) 行出现错误
此代码:: xslProcessor = new XSLTProcessor(); xslProcessor.importStylesheet(xsl); result = xslProcessor
我的任务是修复一个旧网站,使其与现代浏览器兼容。不过,有些 3rd 方控件让我有些不舒服,而且我不会付费来获取这些控件的最新版本。这些旧网格之一有一些内置的 javascript,在处理 XSLTPr
我在 typescript 代码中使用 XSLTProcessor 时遇到了一些问题。 transformToDocument 总是在没有明显原因的情况下返回 null。这是我的代码: private
我正在更新我的脚本以将我们的代码从 Ubuntu 12.04 (PHP 5.3.10) 移动到 Ubuntu 14.04 (PHP 5.5.9),但是 $result = $proc->transfo
我已经成功地使用 XSLT 转换 XML 文档,我正在从 JavaScript 启动该过程。由于 XML 输入相当大,我的计划是在 webworker 中启动 XSLT 转换。 我在这一行得到的错误
我正在尝试将 XML 转换为 XHTML。我在客户端(Angular)使用了 XSLTProcessor,它工作正常。现在我尝试在 Node JS 中使用相同的代码,但它不起作用,并且我收到错误消息,
错误: Warning: XSLTProcessor::importStylesheet() [xsltprocessor.importstylesheet]: Undefined variable
我正在使用 XAMPP 服务器 1.7.7 打开 php 文件时,我收到错误提示 fatal error :找不到类“XSLTProcessor” 最佳答案 安装 XSL 扩展以获取该类。这可能就像在
本文整理了Java中mx4j.tools.adaptor.http.XSLTProcessor.setUseCache()方法的一些代码示例,展示了XSLTProcessor.setUseCache(
本文整理了Java中mx4j.tools.adaptor.http.XSLTProcessor.()方法的一些代码示例,展示了XSLTProcessor.()的具体用法。这些代码示例主要来源于Gith
本文整理了Java中mx4j.tools.adaptor.http.XSLTProcessor.setPathInJar()方法的一些代码示例,展示了XSLTProcessor.setPathInJa
我有一个 XSL 文件。 我有一个带有 XSLTProcessor 的 PHP 文件,名为 $bob . 我想向我的 xsl 转换发送一些参数。 所以,我把它写在我的 PHP 文件中;例如: $bob
当尝试执行以下操作时 $xsl = new XSLTProcessor(); 我收到此错误 Fatal error: Class 'XSLTProcessor' not found in 我见过thi
我是一名优秀的程序员,十分优秀!