xml - Perl 调整 xsltMaxDepth (--maxdepth) 错误
问题描述
我有一个简单的 perl 程序,它读取一个 xml 文件和 xslt 文件并像这样对它运行转换
命令:
perl perl_xslt_translator.pl C000143.xml 04_TestStylesheet.xsl C000143_04.xml PROG123
perl 代码如下所示。
代码:
use strict;
use warnings;
use Data::Dump qw(dump);
use XML::LibXML;
use XML::Simple;
use XML::LibXSLT;
use XML::LibXML;
use Data::Dumper;
print "Perl Starting ... \n\n";
#
# This reads the filename as an argument
#
# store the 1st argument into the variable
my ($XML_FILE, $XSLT_FILE, $OUTPUT_FILE, $PROGRAM_NAME) = @ARGV;
print "XML File: $XML_FILE ... \n";
print "XSLT File: $XSLT_FILE ... \n";
print "PRGM Name: $PROGRAM_NAME ... \n";
print "Output File: $OUTPUT_FILE ... \n";
#create output file
open(my $output_xml_file_name, '>', $OUTPUT_FILE);
my %in_params = (
PROGRAM => "$PROGRAM_NAME",
);
my $parser = XML::LibXML->new();
my $xslt = XML::LibXSLT->new();
print "Reading files ... \n\n";
my $source_xml = $parser->parse_file($XML_FILE);
my $xslt_doc = $parser->parse_file($XSLT_FILE);
my $stylesheet = $xslt->parse_stylesheet($xslt_doc);
print "Transforming XML ... \n\n";
my $results = $stylesheet->transform($source_xml, XML::LibXSLT::xpath_to_string(%in_params));
print "Saving XML ... \n\n";
print $output_xml_file_name "$results";
print "\nPerl End ... \n\n";
我遇到的问题是,对于 500MB 的非常大的 XML 文件,我收到以下错误。对于 70 - 100MB 的较小文件,它可以正常工作。如何将 maxdepth 从 250 调整为 5000?
输出错误:
runtime error: file 04_TestStylesheet.xsl element param
xsltApplyXSLTTemplate: A potential infinite template recursion was detected.
You can adjust xsltMaxDepth (--maxdepth) in order to raise the maximum number of nested template cal
ls and variables/params (currently set to 250).
根据以下用户的建议之一,我将此行更改为
my $xslt = XML::LibXSLT->new()->max_depth(1000);
但现在我得到了这个错误。
Can't locate object method "parse_stylesheet" via package "250" (perhaps you forgot to load "250"?)
at perl_xslt_translator.pl line 38.
Here line38# my $stylesheet = $xslt->parse_stylesheet($xslt_doc);
解决方案
根据文档,只需将以下内容添加到您的程序中:
XML::LibXSLT->max_depth(1000);
不要换use XML::LibXSLT;
不要换my $xslt = XML::LibXSLT->new();
推荐阅读
- javascript - 仅在 Javascript 中转义“特殊”URI 字符
- reactjs - 如何在反应中从父级调用子组件函数
- swift - 在 Swift 中,您应该使用内置的 get/set 属性还是使用 getter/setter 方法?
- php - 这是我的 laravel 项目中的一个额外的“)”,laravel 为我查询
- javascript - 如何将按键发送到输入字段?
- python - 决策树 AttributeError:模块“sklearn.tree”在 Jupyter Notebook 中没有属性“plot_tree”错误
- python - sklearn IterativeImputer 如何在幕后工作?
- docker - Kubernetes 可以在单台机器上对多个 Docker 容器进行负载均衡吗?
- ansible - 无法打开 SSH 公钥
- java - 如何嵌套 if - else 用 4 个数字来找到最大的数字