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>
答案 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方法。