2

前提:私はC ++から来ており、Perlにはかなり慣れていません。特定のファイルにスタイルシート宣言を追加しようとしてい.xmlます。.xmlファイルは3番目の部分によって作成され、脇にダウンロードされます。XMLの正確性や整形式性に疑問を投げかけることはありません。また、ファイル内のXMLがインデントされているのか1行であるのかもわかりません。

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の後および前に行う必要があります。

4

1 に答える 1

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);
于 2012-10-05T11:50:34.023 に答える