XML ドキュメントを HTML に変換しています。必要なことの 1 つは、HTML で合法的に宣言できない名前空間の削除です (ルート タグ内の XHTML 名前空間でない限り)。XML::LibXML と LibXML2 でこれを行うのがいかに難しいかについての 5 ~ 10 年前の投稿を見つけましたが、最近はそうではありません。次に例を示します。
use XML::LibXML;
use XML::LibXML::XPathContext;
use feature 'say';
my $xml = <<'__EOI__';
<myDoc>
<par xmlns:bar="www.bar.com">
<bar:foo/>
</par>
</myDoc>
__EOI__
my $parser = XML::LibXML->new();
my $doc = $parser->parse_string($xml);
my $bar_foo = do{
my $xpc = XML::LibXML::XPathContext->new($doc);
$xpc->registerNs('bar', 'www.bar.com');
${ $xpc->findnodes('//bar:foo') }[0];
};
$bar_foo->setNodeName('foo');
$bar_foo->setNamespace('','');
say $bar_foo->nodeName; #prints 'bar:foo'. Dang!
my @namespaces = $doc->findnodes('//namespace::*');
for my $ns (@namespaces){
# $ns->delete; #can't find any such method for namespaces
}
say $doc->toStringHTML;
このコードでは、うまくいかないことをいくつか試しました。最初に、bar:foo
要素の名前を接頭辞なしに設定しようとしましたfoo
(ドキュメントには、そのメソッドは名前空間を認識していると書かれていますが、明らかに認識していません)。次に、要素の名前空間を null に設定しようとしましたが、それも機能しませんでした。最後に、名前空間を削除する方法についてドキュメントを調べました。そのような幸運はありません。最終的な出力文字列には、削除したいものがすべて含まれています (名前空間の宣言と接頭辞)。
名前空間を削除して、要素と属性を null 名前空間に設定する方法はありますか?