我正在尝试使用XSLT 1.0执行简单的xml转换.
这是我的xml和xslt文件.
这是我的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相关).
我错过了一些明显的东西吗
:更新时间:
我把我的程序作为
perl transform.pl -p trans.xslt -f example.xml
不知何故,您正在将您的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