#xml #perl #xslt
#xml #perl #xslt
Вопрос:
я знаю, это кажется глупым, но как я могу увидеть результирующий xml? например, исходный XML:
<?xml-stylesheet type="text/xsl" href="root.xsl"?>
<root>
<list>
<a>aaaa</a>
<b>bbbb</b>
</list>
</root>
и соответствующий xslt:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" >
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:param name="evalue">cccc</xsl:param>
<xsl:param name="ename">c</xsl:param>
<xsl:output method="xml" encoding="utf-8"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="list">
<xsl:copy>
<xsl:apply-templates/>
<xsl:if test="not(c)">
<xsl:element name="{$ename}"><xsl:value-of select="$evalue"/></xsl:element>
</xsl:if>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
и я хочу увидеть результат:
<?xml-stylesheet type="text/xsl" href="root.xsl"?>
<root>
<list>
<a>aaaa</a>
<b>bbbb</b>
<c>cccc</c>
</list>
</root>
не:
aaaabbbbcccc
я пробую perl moudle:XML::XSLT
use diagnostics;
use XML::XSLT;
my $xsl='root.xsl';
my $xmlfile='root.xml';
my $xslt = XML::XSLT->new ($xsl, warnings => 1);
$xslt->transform ($xmlfile);
print $xslt->toString;
$xslt->dispose();
но это не работает, я никогда раньше не использовал xslt, я на неправильном пути?
заранее спасибо.
Комментарии:
1. Похоже, это вопрос о Perl XML / XSLT API, а не о самом XSLT. Поэтому я сожалею, что не могу вам с этим помочь.
2. @_trivial: Не рекомендуется просматривать результат преобразования в браузере. Используйте любой хороший текстовый редактор или одну из существующих XSLT IDE.
Ответ №1:
(Удаляя все старые жалобы).
Оказывается, я могу заставить это работать, используя атрибуты выбора. Таким образом, он не работает для значений текстового узла (по крайней мере, так кажется). Итак, вот что я сделал. Я изменил ваш XML, чтобы сделать это:
...
<xsl:param name="evalue" select="cccc"/>
<xsl:param name="ename" select="c"/>
...
А затем, поняв, что я получаю фрагмент документа ( XML::DOM::DocumentFragment
) как $xslt-> result_document, я использовал владельца документа и изменил строку печати на:
выведите » n—n», $xslt-> result_document-> getOwnerDocument->toString, «n—n»;
Тем не менее, это похоже на старый документ. И я бы действительно предложил использовать что-то другое, в нем есть открытые и новые ошибки 2005-2006 годов:https://rt.cpan.org/Public/Dist/Display.html?Name=XML-XSLT И последняя исправленная ошибка была также 6 лет назад:https://rt.cpan.org/Public/Dist/Display.html ?Статус= Решенamp;Имя= XML-XSLT
Чем больше я копаюсь в коде, тем больше я вижу в нем ошибок.
Что значит «это не работает»?!! Вы получаете трассировку стека, как и я? Из того, что я вижу (в версии 0.48, которая у меня есть), этот модуль является заброшенным и, вероятно, по уважительной причине.
- Единственный способ хранения XML-документа — это
open_xml
который вызывается только вopen_project
илиtransform
. open_project
не вызывается внутренне, аtransform
вызывается только с помощьюserve
, которая не вызывается внутренне
Однако,
new
всегда вызываетopen_xsl
- Который всегда вызывает
__preprocess_stylesheet
- Который всегда вызывает
__extract_top_level_variables
- Который пытается проанализировать элементы variable и param, и если у этого элемента нет
select
атрибута (которого у вас нет), он пытается вызватьxml_document
, а затем егоcreateDocumentFragment
метод. Однако это (насколько я вижу) не позволило вам установитьxml_document
. Вероятно, это означало вызватьxsl_document
. Но к тому времени, когда он попадает сюда, он уже хранитXML::DOM::Element
НЕ документ как обязательную часть__get_stylesheet
вызываемого все время от__preprocess_stylesheet
до__extract_top_level_variables
вызова.
Итак, когда я оставил вызов, как xml_document
он сказал мне:
Can't call method "createDocumentFragment" on an undefined value
. Но если вы назначите это более правильному xsl_document
полю, вам скажут
Can't locate object method "createDocumentFragment" via package "XML::DOM::Element"
.
В любом случае, я считаю, что XML::LibXSLT
это гораздо более стандартно.
Комментарии:
1. я получил следующую ошибку: XML::LibXSLT object версии 1.70 не соответствует параметру начальной загрузки 1.75 в C:/strawberry/perl/lib/DynaLoader.pm строка 223. Сбой запуска — компиляция прервана на C:/strawberry/perl/site/lib/XML/LibXSLT.pm строка 44.