как увидеть результат xml файлов после использования xslt - PullRequest
0 голосов
/ 04 ноября 2011

Я знаю, что это кажется глупым, но как я могу увидеть результат 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>

not:

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 Ответ

2 голосов
/ 04 ноября 2011

(Отбрасывание всех старых жалоб).

Оказывается, я могу заставить это работать, используя атрибуты select.Так что это сломано для значений текстовых узлов (по крайней мере, кажется)Итак, вот что я сделал.Я изменил ваш XML, чтобы сделать это:

  ...
  <xsl:param name="evalue" select="cccc"/>  
  <xsl:param name="ename"  select="c"/>
  ...

И затем, понимая, что я получаю документ фрагмент (XML::DOM::DocumentFragment) как $ xslt-> result_document, я использовал владельца документаи изменил строку печати на:

print "\ 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?Status=Resolved&Name=XML-XSLT

Чем больше яползать в коде, тем больше вещей я вижу не так с ним.


Что значит "это не работает"? !!Вы получаете трассировку стека, как я?Из того, что я вижу, (в имеющейся у меня версии 0.48) этот модуль является заброшенным и, вероятно, по уважительной причине.

  • Единственный способ хранить XML-документ - это open_xml, который вызывается тольков open_project или transform.
  • open_project не вызывается внутренне, а transform вызывается только serve, который не вызывается внутренне

Однако

  • new всегда вызывает open_xsl
  • Который всегда вызывает __preprocess_stylesheet
  • Который всегда вызывает __extract_top_level_variables
  • Который пытается проанализировать переменные и элементы param и, если этоЭлемент не имеет атрибута select (которого у вас нет), он пытается вызвать xml_document, а затем его метод createDocumentFragment.Тем не менее, он (насколько я вижу) не позволил вам установить xml_document.Вероятно, это означало позвонить xsl_document.Но к тому времени, когда он здесь появляется, он уже хранит XML::DOM::Element NOT Документ как обязательную часть __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 в любом случае намного более стандартно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...