0

我需要渲染通过找到的节点集XML::XPath

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

使用 XSLT 模板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);

因为 transform 需要一个XML::LibXML::Document对象,而不是 XML::XPath::NodeSet.

我应该怎么办?有没有办法XML::LibXML::Document从 a创建一个XML::XPath::NodeSet

或者也许给 XSLT 模板一个变量,这样我就不必使用 XPath 查找节点?

4

1 回答 1

1

没有将对象转换为XML::XPath::NodeSet对象的直接方法XML::LibXML::Document。此外,通常不可能,因为 Nodeset 可以包含任意数量的 XML 元素,而 XML 文档必须只有一个根元素。

但是 XPath 是 XSLT 的一个组成部分,因此您没有理由不重写转换,以便它//area[@id="01"]自己进行选择,然后将整个文档提供给它,由 XML::LibXML 解析。这是我会选择的方法。

如果您有理由<area id="01">单独选择元素,则可以通过将 Nodeset 中的每个元素转换为字符串并将它们捆绑为虚拟<root>XML 元素来构建新的 XML 文档,但这远非理想的解决方案。

如果您对实施解决方案有疑问,请再次询问。

于 2012-05-10T15:19:25.920 回答