使用perl + LibXML向给定XML添加XSLT样式表声明

时间:2012-10-05 11:31:15

标签: xml perl stylesheet xml-libxml

前提:我来自C ++,而且我在Perl非常棒。 我正在尝试将样式表声明添加到给定的.xml文件中。 .xml文件由第三部分创建并下载到一边;我们不会质疑XML的正确性和良好性。我们也不知道文件中的XML是缩进的还是单行的。

无法仅使用Perl整齐地操作文件,我使用了XML :: LibXML,但我仍然卡住了。到目前为止,这是我所做的。

#!/usr/bin/perl
use strict;
use warnings;
use XML::LibXML;

my $path = './file.xml';

my $fxml = XML::LibXML::Document->new('1.0','utf-8');
my $pi = $fxml->createPI("xml-stylesheet");
$pi->setData(type=>'text/xsl', href=>'trasf.xsl');
$fxml->appendChild($pi);

$XML::LibXML::skipXMLDeclaration = 1;
my $docwodecl = XML::LibXML::Document->new;
$docwodecl = $doc->toString;

open my $out_fh, '>', $path;
print {$out_fh} $final_xml.$docwodecl;
close $out_fh;

有了这个,我只得到没有初始声明<?xml version="1.0" encoding="ISO-8859-1"?>的XML,并且utf-8字符都搞砸了。 我试过用这样的东西

$fxml->setDocumentElement($doc);
$fxml->toFile($path);

但它不起作用。 有一些方法我可以用来完成我(毕竟非常简单)的目标?我看过docs,但找不到任何有用的东西。

编辑

样式表声明必须在<?xml version="1.0" encoding="UTF-8"?>之后和实际XML之前。

1 个答案:

答案 0 :(得分:2)

将您的fxml初始化更改为

my $fxml = XML::LibXML->load_xml(location => $path);

您没有在任何地方加载原始文件。

更新

您可以使用insertBefore在根元素之前插入节点

my $path = '1.xml';
my $fxml = XML::LibXML->load_xml(location => $path);
my $pi   = $fxml->createPI('xml-stylesheet');
$pi->setData(type => 'text/xsl', href => 'trasf.xsl');
$fxml->insertBefore($pi, $fxml->documentElement);