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);

XML::LibXML::Documentなぜなら、transformはではなくオブジェクト を期待しているからXML::XPath::NodeSetです。

私は何をすべきか?XML::LibXML::Documentからを作成する方法はありXML::XPath::NodeSetますか?

または、XSLTテンプレートに変数を指定して、XPathでノードを見つける必要がないようにすることもできますか?

4

1 に答える 1

1

XML::XPath::NodeSetオブジェクトをオブジェクトに変換する直接的な方法はありませんXML::LibXML::Document。さらに、ノードセットには任意の数のXML要素を含めることができますが、XMLドキュメントにはルート要素を1つだけ含める必要があるため、一般的には不可能です。

//area[@id="01"]ただし、XPathはXSLTの不可欠な部分であるため、XML :: LibXMLで解析されるように、変換自体を選択してからドキュメント全体を提供するように変換を書き直すべきではない理由はありません。これが私が選ぶ方法です。

要素を個別に選択する理由がある場合<area id="01">は、ノードセット内の各要素を文字列に変換し、それらをダミーの<root>XML要素にバンドルすることで、新しいXMLドキュメントを作成できますが、これは理想的なソリューションとはほど遠いものです。

ソリューションの実装について質問がある場合は、もう一度質問してください。

于 2012-05-10T15:19:25.920 に答える