как увидеть результирующие XML-файлы после использования xslt

#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.