我正在尝试使用XSLT 1.0执行简单的xml转换。 这是我的xml和xslt文件。
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>
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>
这是我正在使用的perl脚本。
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;
我不确定会出现什么问题但是在运行这个perl脚本时,我遇到了以下错误,我无法解密。
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.
当我在错误消息中搜索关键字时,找不到任何类似的帖子(与XML / XSLT相关)。 我错过了一些明显的东西吗?
:UPDATE:
我将程序作为
运行 perl transform.pl -p trans.xslt -f example.xml
答案 0 :(得分:3)
不知何故,您正在将您的XSLT文件作为Perl代码执行,但您的问题中没有任何内容可以解释如何操作。事实上,正如我评论的那样,你显示的Perl代码不能导致你说的错误,因为它不会编译
我可以看到调用$stylesheet->transform_file($source)
时出现问题,该问题可能是$stylesheet->transform($source)
或$stylesheet->transform_file($xmlfile)
,但其他错误很明显
另请注意,使用xml-stylesheet
处理指令附加到XML文档的样式表为test.xsl
,而Perl代码适用test.xslt
。你应该选择一个或另一个
您对$stylesheet->output_as_bytes($results)
的通话效果更好$stylesheet->output_as_chars($results)
。它与纯ASCII数据没有任何区别,但前者将产生编码的八位字节,这很少有用。通常你只想要一个字符串
在基本程序运行之前,最好避免编写奇特的参数输入和异常处理代码。我建议您从我的代码开始,如果您必须处理错误,请使用Try::Tiny
模块而不是简单的eval
。目前,你所有的处理程序似乎都是用很多明星补充异常消息,然后无论如何都要死掉,所以我认为你可以不用它们来做
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);
Article - My Article
Authors:
- Mr. Foo
- Mr. Bar
答案 1 :(得分:1)
由于编译错误,trans.xslt的执行中止。
这看起来就像你在尝试执行你的XSLT文件,而不是你的Perl程序。
你应该运行这样的东西:
$ ./your_xslt_processor.pl -f your_xml.xml -p trans.xslt