J'essaie d'effectuer une simple transformation XML à l'aide de XSLT 1.0. Voici mes fichiers xml et xslt.

Fichier XML

<?xml version="1.0"?>
<?xml-stylesheet type="xsl" href="trans.xsl"?>
<Article>
  <Title>My Article</Title>
  <Authors>
    <Author>Mr. Foo</Author>
    <Author>Mr. Bar</Author>
  </Authors>
  <Body>This is my article text.</Body>
</Article>

Fichier XSLT

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">    
  <xsl:output method="text"/>    
  <xsl:template match="/">
    Article - <xsl:value-of select="/Article/Title"/>
    Authors: <xsl:apply-templates select="/Article/Authors/Author"/>
  </xsl:template>    
  <xsl:template match="Author">
    - <xsl:value-of select="." />
  </xsl:template>    
</xsl:stylesheet>

Et voici mon script perl que j'utilise.

use strict;
use warnings;
use Getopt::Std;
use File::Path;
use File::Spec;
use File::Basename;
use Env;
use XML::LibXSLT;
use XML::LibXML;

my %opts = ();
getopts('p:f:'\%opts);

my $xsltfile = $opts{'p'};
die "XSLT file not specified" if !defined($xsltfile);

my $xmlfile = $opts{'f'};
die "XML file not specified" if !defined($xmlfile);

# XSLT Transformation code starts here

#my $xml_parser = XML::LibXML->new();
#my $source = $xml_parser->parse_file($msgcatfile);

my $source = XML::LibXML->load_xml(location => $xmlfile);

#my $xslt_parser = XML::LibXML->new();
#my $xslt_source = $xslt_parser->parse_file($xsltfile);

my $xslt_source = XML::LibXML->load_xml(location => $xsltfile);    
my $xslt = XML::LibXSLT->new();

my $stylesheet;

eval { $stylesheet = $xslt->parse_stylesheet($xslt_source); };

if ($@)
{
    print "$@";
    die "\n!******************Error in parsing the stylesheet file : $xsltfile ************************!\n";
}

eval { my $results = $stylesheet->transform_file($source); };

if ($@)
{
    print "$@";
    die "\n!******************Error in transforming the input xml file : $source ************************!\n";
}
print $stylesheet->output_as_bytes($results);
0;

Je ne sais pas ce qui ne va pas, mais lorsque j'exécute ce script perl, je reçois des erreurs de suivi que je ne suis pas en mesure de déchiffrer.

Bareword found where operator expected at trans.xslt line 2, near ""1.0" xmlns"
        (Missing operator before xmlns?)
Bareword found where operator expected at trans.xslt line 11, near "</xsl"
  (Might be a runaway multi-line // string starting on line 10)
        (Missing operator before l?)
syntax error at trans.xslt line 2, near "xsl:"
Execution of trans.xslt aborted due to compilation errors.

Je n'ai trouvé aucun article similaire (concernant XML/XSLT) lorsque j'ai recherché des mots-clés dans le message d'erreur. Est-ce que j'ai raté quelque chose d'évident ?

 :MISE À JOUR :

J'ai exécuté mon programme en tant que

perl transform.pl -p trans.xslt -f example.xml

0
Recker 9 juin 2016 à 15:12

2 réponses

Meilleure réponse

D'une manière ou d'une autre, vous exécutez votre fichier XSLT en tant que code Perl, mais il n'y a rien dans votre question pour expliquer comment. En fait, comme je l'ai commenté, le code Perl que vous montrez ne peut pas a causé l'erreur que vous dites parce qu'il ne compilera pas

Je peux voir un problème avec l'appel à $stylesheet->transform_file($source), qui devrait être soit $stylesheet->transform($source) soit $stylesheet->transform_file($xmlfile), mais le reste des bugs est évident

Notez également que la feuille de style jointe au document XML avec l'instruction de traitement xml-stylesheet est test.xsl, alors que votre code Perl s'applique test.xslt. Vous devez choisir l'un ou l'autre

Votre appel à $stylesheet->output_as_bytes($results) est meilleur que $stylesheet->output_as_chars($results). Cela ne fait aucune différence avec des données ASCII pures, mais les premières produiront des octets codés, ce qui est rarement utile. Habituellement, vous voulez juste une chaîne de caractères

Il est préférable d'éviter d'écrire des entrées de paramètres fantaisistes et du code de gestion des exceptions avant que le programme de base ne fonctionne. Je vous suggère plutôt de commencer à partir de mon code ici et d'utiliser le module Try::Tiny à la place d'un simple eval si vous devez gérer les erreurs. À l'heure actuelle, tout ce que vos gestionnaires semblent faire est de compléter le message d'exception avec beaucoup d'étoiles puis de mourir de toute façon, donc je pense que vous pouvez vous en passer

use strict;
use warnings;

use XML::LibXSLT;

my ($xmlfile, $xsltfile) = qw/ example.xml trans.xsl /;

my $xslt = XML::LibXSLT->new;
my $stylesheet = $xslt->parse_stylesheet_file($xsltfile);
my $results    = $stylesheet->transform_file($xmlfile);

print $stylesheet->output_as_chars($results);

Production

Article - My Article
Authors: 
- Mr. Foo
- Mr. Bar
3
Borodin 9 juin 2016 à 16:18

Exécution de trans.xslt interrompue en raison d'erreurs de compilation.

On dirait que vous essayez d'exécuter votre fichier XSLT, pas votre programme Perl.

Vous devriez exécuter quelque chose comme ceci :

$ ./your_xslt_processor.pl -f your_xml.xml -p trans.xslt
1
Dave Cross 9 juin 2016 à 15:24