【问题标题】:Adding to a given XML the XSLT stylesheet declaration with perl + LibXML使用 perl + LibXML 将 XSLT 样式表声明添加到给定的 XML
【发布时间】:2012-09-26 13:23:30
【问题描述】:

前提:我来自 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,但找不到任何有用的东西。

EDIT

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

【问题讨论】:

    标签: xml perl stylesheet xml-libxml


    【解决方案1】:

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

    【讨论】:

    • 我被困在将样式表声明正好放在 <?xml ?> 声明之后和根元素之前。将它放在 XML 的底部解决了整个问题! :-)
    • 我刚刚发现样式表声明需要放在顶部,在 xml 声明和实际 XML 之间。所以你的解决方案不是最终的......
    • 顺便说一句,除了cpan.org,我在哪里可以找到有用的方法的参考?我现在读到insertBeforeXML::GDOME 的一部分,但我不知道我永远不会开始使用它。
    • 谢谢!抱歉,我没有足够的声望来进一步 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 2021-06-16
    相关资源
    最近更新 更多