【问题标题】:Performing an XSLT transformation on part of an XML document selected with DOMXPath对使用 DOMXPath 选择的 XML 文档的一部分执行 XSLT 转换
【发布时间】:2012-11-13 09:05:45
【问题描述】:

好吧,这让我发疯了。我正在尝试使用 XML 文件和一些 PHP 制作一个简单的 CMS。我有一个这样的 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<sections>
<section name="about">
    <maintext>
        <p>Here is some maintext. </p>
    </maintext>
</section>
<section name="james">
    <maintext>
        <p>Zippidy do.</p>
    </maintext>
</section>
</sections>

然后是 XSL 文件:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" />
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="section">
<div class="section">
    <xsl:apply-templates />
</div>  
</xsl:template>
<xsl:template match="maintext">
<xsl:copy-of select="child::node()" />
</xsl:template>
</xsl:stylesheet>

这种转换效果很好 - 我得到了几个简单的段落:

<p>Here is some maintext. </p>      
<p>Zippidy do.</p>

但是,我现在有一个 PHP 文件,它应该查询 XML,根据它的 GET 参数获取一个特定的“部分”。然后只对 XML 的那一部分运行转换,并回显结果。

<?php

$sectionName = $_GET["section"];
$content = new DOMDocument();
$content->load("content.xml");
$transformation = new DOMDocument();
$transformation->load("transform-content.xsl");
$processor = new XSLTProcessor();
$processor->importStyleSheet($transformation);
$xpath = new DOMXPath($content);
$sectionXML = $xpath->query("section[@name='".$sectionName."']")->item(0);

echo $processor->transformToXML($sectionXML);
?>

问题在于,无论我做什么,整个 XML 文件都会被转换,而不仅仅是我使用查询选择的部分。我在这里做错了什么?!

【问题讨论】:

  • transformToXML 需要 DOMDocument 参数,而不是任意节点。如果你改用transformToDoc,它会起作用吗?
  • 否则,创建一个新的空文档,import 和 append 将部分元素转换为该元素,然后对其进行转换。
  • TransforToDoc 不起作用,但使用导入和附加方法效果很好 - 感谢您的帮助!奇怪的是,在我的原始代码中,当它刚刚从路径查询中获得节点时,transformToXML 继续转换原始 XML 文档。为什么不直接抛出错误类型呢?哦,好吧……无论如何问题都解决了! :)
  • 猜测它正在获取节点的 ownerDocument 并对其进行转换。无论如何,很高兴它有帮助,我已经将我的 cmets 变成了你可以接受的答案。

标签: php xml xslt content-management-system


【解决方案1】:

transformToXML 需要DOMDocument,而不仅仅是任何节点。我猜它在您当前的代码中所做的是转换您传递它的节点的“所有者文档”。

尝试创建一个新文档,然后使用$newDoc-&gt;appendChild($newDoc-&gt;importNode($sectionXML, true)) 将现有元素附加到新文档,然后转换此文档而不是原始文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 2011-02-05
    • 2020-11-22
    相关资源
    最近更新 更多