http://qs321.pair.com?node_id=1059164


in reply to Replacing an XPath node with the value of its content

Is the tm element the only child of another node? If so, you can get the parent of the matching node, remove it's children, then insert the text node:

use strict; use warnings; use XML::LibXML; my $xml_str = <<_XML_STR; <foo> <bar> <tm tmclass="ibm" tmowner="IBM Corporation" tmtype="reg" trademark="AIX">AIX</tm> </bar> </foo> _XML_STR my $parser = XML::LibXML->new(); my $doc = $parser->parse_string( $xml_str ); my $query = "//tm"; foreach my $node ( $doc->findnodes($query) ) { my $val = $node->findvalue( '@tmowner' ); my $txt = $node->textContent(); if( $val !~ /my_company/ ) { my $parent = $node->parentNode(); $parent->removeChildNodes(); $parent->appendTextNode( $txt ); } } print $doc->toString;
would produce:
<foo> <bar>AIX</bar> </foo>
-derby

Replies are listed 'Best First'.
Re^2: Replacing an XPath node with the value of its content
by stylechief (Sexton) on Oct 21, 2013 at 22:54 UTC

    Thanks, Derby, this is a step in the right direction.

    Unfortunately, it is not the only child of another node. In fact, there may be multiple <tm> or other children within a given parent.

    This <tm> element is being used to trigger inline formatting during output processing. In this example, a superscript "TM" would be added automatically like AIXTM. So there may be more than 1 in the same sentence, paragraph, etc. within a single parent.

    Testing your suggestion, it certainly removes the <tm> child, but appends the "AIX" to the very end of the parent, as one would expect (and as you insinuated).

    I am currently looking into the XML::LibXML::Document class. It has some methods that look promising, perhaps I can use a fragment or text node somehow.

    Thanks for looking into this!

    SC