0

Perl/CPAN XML::LibXMLを使用して、 <h1> 、 <h2> などの複数のネストされた <div> タグを含む有効な XHTML 1.1 ドキュメントを解析および操作しています。

ここで、そこから div を抽出しています。それらには <xhtml:h2 /> から始まるタイトルがあり、これを <xhtml:h1 /> から始まるものに変換したい (つまり: h2 → h1 ; h3 → h2 ; h4 → h3 など) .)。

XML::LibXML を使用してそれを行うにはどうすればよいですか?

これが私がこれまでに持っているものです:

    foreach my $h_idx (2 .. 6)
    {
        foreach my $h_tag ($scene_xpc->findnodes(qq{//xhtml:h$h_idx}))
        {
            my $replacement = $h_tag->cloneNode(1);
            # TODO : how do I set the name?
            $replacement->set
            $h_tag->replaceNode($replacement);
        }
    }
4

1 に答える 1

2

変数名から推測したように、名前空間が定義されている$scene_xpcを定義する必要があります。その後、要素名と属性名に登録された名前空間を指定できることを除いて、通常のオブジェクトと同じようにそのコンテキストを使用できます。XML::LibXML::XPathContextxhtmlXML::LibXML

各ノードのクローンを作成する理由がわかりません。私が知る限り、あなたがする必要があるsetNodeNameのは各ノード上だけです。必要なのはローカル名だけです。要素は元の名前空間を保持します。

この短いプログラムはその考えを示しています。

use strict;
use warnings;
use 5.014;    # For non-destructive substitution

use XML::LibXML;

my $filename = 'xhtml.html';

my $xml = XML::LibXML->new;
my $doc = $xml->parse_file($filename);

my $xpc = XML::LibXML::XPathContext->new($doc);
$xpc->registerNs('xhtml', 'http://www.w3.org/1999/xhtml');

for my $head ('h2' .. 'h6') {
  my $newhead = $head =~ s/(\d)/$1-1/er;
  for my $node ($xpc->findnodes("//xhtml:$head")) {
    $node->setNodeName($newhead);
  }
}

print $doc->toString;
于 2013-03-21T09:16:29.990 に答える