如何在 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));
然后将该虚拟文档传递给转换方法。
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));
然后将该虚拟文档传递给转换方法。