我有一个xml文档,我将其转换,在浏览器中查看并保存到目录中。
我想在已保存的文件版本中添加链接样式表。我已经尝试过如下str_replace(可能是不正确的用法)并且还使用了xsl处理指令。
xsl处理指令在某种程度上有效,如果你在浏览器中查看源代码,你会看到样式表链接,但它不会将这些信息保存到保存的文件中!!
我想做的就是获取原始xml文件,使用样式表将其转换,将其保存到目录并将xsl样式表附加到新文件的标题中,这样当新保存的xml文件在浏览器,样式表自动应用。希望这有意义!!
我的代码如下。
//write to the file
$id = $_POST['id'];//xml id
$path = 'xml/';//send to xml directory
$filename = $path. $id . ".xml";
$header = str_replace('<?xml version="1.0" encoding="UTF-8"?>', '<?xml version="1.0" encoding="UTF-8" ?><?xml-stylesheet type="text/xsl" href="../foo.xsl"?>');
$article->asXML($filename);//saving the original xml as new file with posted id
$xml = new DOMDocument;
$xml->load($filename);
$xsl = new DOMDocument;
$xsl->load('insert.xsl');
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);
echo $proc->transformToXML($xml);
提前致谢!
答案 0 :(得分:1)
您可以使用XSLT文件中的<xsl:processing-instruction/>
标记添加样式表链接。
<xsl:processing-instruction name="xml-stylesheet">
type="text/xsl" href="../foo.xsl"
</xsl:processing-instruction>
这会产生:
<?xml-stylesheet type="text/xsl" href="../foo.xsl"?>
另外,您可以使用DOMDocument
。
$newXml = $proc->transformToXML($xml);
// Re-create the DOMDocument with the new XML
$xml = new DOMDocument;
$xml->loadXML($newXml);
// Find insertion-point
$insertBefore = $xml->firstChild;
foreach($xml->childNodes as $node)
{
if ($node->nodeType == XML_ELEMENT_NODE)
{
$inertBefore = $node;
break;
}
}
// Create and insert the processing instruction
$pi = $xml->createProcessingInstruction('xml-stylesheet', 'type="text/xsl" href="../foo.xsl"');
$xml->insertBefore($pi, $insertBefore);
echo $xml->saveXML();