/ / Aggiunta a un dato XML la dichiarazione del foglio di stile XSLT con perl + LibXML - xml, perl, stylesheet, xml-libxml

Aggiunta a un dato XML la dichiarazione del foglio di stile XSLT con perl + LibXML - xml, perl, stylesheet, xml-libxml

Premessa: vengo da C ++ e sono piuttosto noob in Perl. Sto cercando di aggiungere una dichiarazione del foglio di stile a un dato .xml file. Il .xml il file viene creato da una terza parte e scaricato da parte; non stiamo mettendo in discussione la correttezza né la ben formata XML. Inoltre, non possiamo sapere se l'XML nel file è rientrato o in una riga.

Non essendo in grado di manipolare il file ordinatamente solo con Perl, ho preso XML :: LibXML ma sono ancora bloccato, questo è ciò che ho fatto finora.

#!/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;

Con questo ottengo solo l'XML senza la dichiarazione iniziale <?xml version="1.0" encoding="ISO-8859-1"?> e i caratteri utf-8 sono tutti incasinati. Ho provato ad usare qualcosa di simile

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

ma non funziona. C'è qualche metodo che potrei usare per raggiungere il mio obiettivo (dopotutto piuttosto semplice)? docs ma non riesco a trovare nulla di utile.

MODIFICARE

La dichiarazione del foglio di stile deve essere dopo il <?xml version="1.0" encoding="utf-8"?> e prima del vero XML.

risposte:

2 per risposta № 1

Cambia l'inizializzazione di fxml in

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

Non stai caricando il file originale da nessuna parte.

Aggiornare

È possibile inserire il nodo prima l'elemento radice usando 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);