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

How do I target the PHP passed context node in XSLT?

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

A <xsl:template match="/"> 匹配文档的根节点(即使我传入了一个子节点),<xsl:template match="."> 使事情崩溃,<xsl:template match="name-of-passed-node"> 确实匹配,但是一切 "above" 它作为文本传递出去(就像默认的 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>

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

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

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

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