如何在XSLT中定位PHP传递的上下文节点?

时间:2017-11-19 14:27:23

标签: php xml xslt domdocument

XSLTProcessor  transformToDoc方法需要DOMNode参数。所以我想我可以加载DOMDocument,从中获取一个节点(例如通过DOMXPath),然后将其传递给XSLT以仅转换该节点并忽略(即不输出)任何其他节点。但是......我如何定位该节点?有没有办法,或者我误解了它是如何运作的?

<xsl:template match="/">匹配文档的根节点(即使我传入子节点),<xsl:template match=".">使事情崩溃,<xsl:template match="name-of-passed-node">确实匹配,但所有内容都在“上方”它作为文本传递出去(就像默认的xsl一样)......

即。鉴于这个PHP:

// Load input document
$doc = new DOMDocument;
$doc->load('some.xml');

// Find the context node we want to transform
$xpath = new DOMXPath($doc);
$node = $xpath->query('//some-node')->item(0);

// Load XSLT document
$xsl = new DOMDocument;
$xsl->load('some.xsl');

// Do transformation
$x = new XSLTProcessor();
$x->importStylesheet($xsl);
$result = $x->transformToDoc($node);

如何在XSLT中定位给定节点,以便仅输出 节点及其后代?

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="   ?   ">
        <xsl:copy-of select="." />
    </xsl:template>

</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

在一些测试中我运行它似乎参数不是设计为接受任意DOM节点作为初始匹配,它似乎在DOM节点的ownerDocument上运行样式表。例如,当您在文档中创建未插入的新节点时,例如$doc->createElement('foo')并将其传递给转换方法,转换$doc所有者文档。所以我认为PHP人员在原始客户端Mozilla XSLTProcessor API之后对XSLTProcessor API进行了一些建模,但传递给转换方法的参数与该API的处理方式大不相同。

我在PHP中看到的唯一选项是,如果样式表不需要在要传递的节点之外导航,则创建带有克隆的虚拟文档

$doc2 = new DOMDocument();
$doc2->appendChild($doc2->importNode($node, TRUE));

然后将该虚拟文档传递给transform方法。