PHP XSLTProcessor 去除样式属性和标签
Posted
技术标签:
【中文标题】PHP XSLTProcessor 去除样式属性和标签【英文标题】:PHP XSLTProcessor strips style attributes and tags 【发布时间】:2019-07-30 18:48:18 【问题描述】:我有这个 XSLT
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="iso-8859-1" method="html"/>
<xsl:template match="/">
<img src='http://www.acentroservices.it/wp-content/uploads/2018/02/document.jpg' style="border: 1px solid black"/>
<style>
img
width: 100%
</style>
<xsl:if test="count(list/*) > 0">
<h2>Ci sono <xsl:value-of select="count(list/element)" /> elementi!</h2>
</xsl:if>
<xsl:if test="count(list/*) = 0">
<h2>Niente!</h2>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
我用来转换此 XML
<list><element><id>2</id><uuid>96506f09-eb04-46a2-af86-42fe9c6767ce</uuid><langcode>it</langcode><type>stu_pratica</type><user_id>1</user_id><name>a</name><status>1</status><created>1552053309</created><changed>1552053331</changed><unique_key>a</unique_key><users>admin</users><xml_content></xml_content><default_langcode>1</default_langcode><field_stu_pratica_classe_proc></field_stu_pratica_classe_proc><field_stu_pratica_data_atto></field_stu_pratica_data_atto><field_stu_pratica_data_fine></field_stu_pratica_data_fine><field_stu_pratica_data_inizio></field_stu_pratica_data_inizio><field_stu_pratica_d_protocollo></field_stu_pratica_d_protocollo><field_stu_pratica_ente></field_stu_pratica_ente><field_stu_pratica_esito></field_stu_pratica_esito><field_stu_pratica_indirizzo></field_stu_pratica_indirizzo><field_stu_pratica_lat></field_stu_pratica_lat><field_stu_pratica_lon></field_stu_pratica_lon><field_stu_pratica_nome_proc></field_stu_pratica_nome_proc><field_stu_pratica_num_atto></field_stu_pratica_num_atto><field_stu_pratica_n_protocollo></field_stu_pratica_n_protocollo><field_stu_pratica_primo_int></field_stu_pratica_primo_int><field_stu_pratica_resp_unico></field_stu_pratica_resp_unico><field_stu_pratica_stato></field_stu_pratica_stato><field_stu_pratica_wkid></field_stu_pratica_wkid><field_stu_pratica_x></field_stu_pratica_x><field_stu_pratica_y></field_stu_pratica_y></element></list>
但是,无论如何我都会尝试执行转换: - 从每个可能的标签中删除样式属性 - 样式标签被移除,但它的内容没有
这只发生在 php XSLTProcessor 中,我使用的任何在线工具都保留了 CSS 说明。
如何在输出中保留 CSS 指令? 为什么这种情况只发生在 PHP XSLTProcessor 而不是在线工具中?
感谢大家的帮助。
编辑:
这是我用来操作转换的一段 PHP 代码:
$output = new \DOMDocument();
$output->loadXML(utf8_encode($body)); // For the XML
$xslt = new \XSLTProcessor();
$xsl = new \DOMDocument(); // For the XSLT Template
$xsl->load($xslt_path, LIBXML_NOCDATA);
$xsl->formatOutput = TRUE;
$xslt->importStylesheet($xsl);
// Setting some parameters, shouldn't have to do with the css problems i think...
$xslt->setParameter('', 'base_url', $base_url);
$auth_url = Url::fromRoute('stu_botfo.view_authenticated_element', ['bundle' => $bundle, 'id' => ''], ['absolute' => TRUE]);
$xslt->setParameter('', 'view_authenticated_element_link', $auth_url->toString() . '/');
$anon_url = Url::fromRoute('stu_botfo.view_anonymous_element', ['bundle' => $bundle, 'id' => ''], ['absolute' => TRUE]);
$xslt->setParameter('', 'view_anonymous_element_link', $anon_url->toString() . '/');
$xslt->setParameter('', 'map_url', $map_url);
return $xslt->transformToXML($output);
【问题讨论】:
你的 PHP 代码在哪里? 很抱歉原谅 PHP 代码,我用脚本编辑了问题,再次感谢 【参考方案1】:在大多数情况下,如果您希望将 HTML 作为输出,则最好在 PHP XSLTProcessor 中直接使用transformToXML()
。您可以更好地控制 xsl:output 属性。
我不确定您是否在 PHP 代码中直接调用 transformToDoc()
。
【讨论】:
感谢您的帮助,我刚刚编辑了问题,因为我忘记添加用于操作转换的PHP代码;我确认我正在使用 transformToXML【参考方案2】:已解决,非常感谢大家。 原来不是 XSLTProcessor 故障,而是在渲染过程后期发生了一些我不知道的 HTML 过滤器,我真的很抱歉之前没有考虑过。
【讨论】:
以上是关于PHP XSLTProcessor 去除样式属性和标签的主要内容,如果未能解决你的问题,请参考以下文章