将 XSLT 样式表声明添加到给定的 XML 中,使用 perl + 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,<?xml version="1.0" encoding="ISO-8859-1"?> utf-8 字符都搞砸了。我尝试使用这样的东西

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

但它不起作用。我可以使用一些方法来实现我的(毕竟非常简单的)目标?我已经查看了文档,但找不到任何有用的东西。

编辑

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

将 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);

相关内容

  • 没有找到相关文章

最新更新