Ошибка настройки Perl xsltMaxDepth (—maxdepth)

#xml #perl #xslt

#xml #perl #xslt

Вопрос:

У меня есть простая программа на 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 ... nn"; 

#
# 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 ... nn";
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 ... nn";
my $results = $stylesheet->transform($source_xml, XML::LibXSLT::xpath_to_string(%in_params));


print "Saving XML ... nn";
print $output_xml_file_name "$results";

print "nPerl End ... nn"; 
  

Проблема, с которой я сталкиваюсь, заключается в том, что для очень больших XML-файлов размером 500 МБ я получаю следующую ошибку. С файлами меньшего размера (70-100 МБ) все работает нормально. Как я могу настроить максимальную глубину с 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);
  

Комментарии:

1. Это буквально первое, что упоминается в документах для XML ::LibXSLT

2. @ikegami Я попробовал это «XML:: LibXSLT-> max_depth (1000);» и это то, что выдается мне при запуске perl «синтаксическая ошибка в perl_xslt_translator.pl строка 6, рядом с «использовать XML::LibXSLT-> max_depth», начинается небезопасно после ошибок — компиляция прервана на perl_xslt_translator.pl строка 7.»

3. Нет, вы этого не сделали XML::LibXSLT->max_depth(1000); . Согласно сообщению об ошибке, там было use .

4. @ikegami пожалуйста, посмотрите мой обновленный вопрос выше. Я добавил ваше предложение и получаю другую ошибку.

5. Серьезно! Вы все еще не используете XML::LibXSLT->max_depth(1000); .

Ответ №1:

Согласно документам, просто добавьте в свою программу следующее:

 XML::LibXSLT->max_depth(1000);
  

Не изменять use XML::LibXSLT;

Не изменять my $xslt = XML::LibXSLT->new();