2012-05-10 75 views
0
的libxslt

Rrendering一個XML :: XPath的:: NODESET我需要呈現使用XSLT模板通過XML::XPath使用XSLT模板與XML ::

my $source = XML::LibXML->load_xml(location => 'xml/animals.xml'); 
my $nodeset = $source->find('//area[@id="01"]'); 

發現了一個節點集與XML::LibXSLT

my $xslt = XML::LibXSLT->new(); 
my $style_doc = XML::LibXML->load_xml(location=>'xml/animal_template.xsl', no_cdata=>1); 
my $stylesheet = $xslt->parse_stylesheet($style_doc); 

但我不能簡單地給節點集到$stylesheet->transform()

my $results = $stylesheet->transform($nodeset); 

,因爲變換期望有一個XML::LibXML::Document對象,而不是XML::XPath::NodeSet

我該怎麼辦?有沒有辦法從XML::XPath::NodeSet創建XML::LibXML::Document

或者也許給XSLT模板一個變量,所以我不必用XPath找到節點?

+0

使用解決 $ stylesheet->變換($文檔,XML :: ::的libxslt xpath_to_string( PARAM => 「字符串」 )); 寫在http://search.cpan.org/~shlomif/XML-LibXSLT-1.77/LibXSLT.pm – qwertoyo

+0

我看不出如何解決您的問題。你是通過'$ doc'傳遞的?以前你只有一個'XML :: XPath :: NodeSet'對象提供。 – Borodin

+0

對不起,它沒有工作。 – qwertoyo

回答

1

沒有直接的方法將XML::XPath::NodeSet對象轉換爲XML::LibXML::Document對象。此外,它通常是不可能的,因爲Nodeset可以包含任意數量的XML元素,而XML文檔必須只有一個根元素。

但XPath是XSLT不可分割的一部分,所以沒有理由不重寫變換,以便它自己選擇//area[@id="01"],然後將其提供給整個文檔,如XML :: LibXML所解析。這是我選擇的方法。

如果您有理由單獨選擇<area id="01">元素,那麼可以通過將Nodeset中的每個元素轉換爲一個字符串並將它們綁定到一個虛擬的XML元素來構建新的XML文檔,但這遠不是理想的解決方案。

如果您對實施解決方案有疑問,請再詢問一次。

+0

「但XPath是XSLT的一個組成部分,所以沒有理由不應該重寫變換,以便它自己執行選擇//區域[@ id =」01「],然後將其提供給整個文檔,這是我選擇的方法「 所以最好的解決方案是動態地重寫模板,每次我需要選擇和渲染我在特定區域內的元素? – qwertoyo

+0

我沒有意識到XPath表達式是可變的。理想情況下,您可以將信息作爲參數傳遞給轉換,但標準XSLT不可能將參數評估爲XPath表達式。根據XPath的不同可能性,您可以編寫' Borodin