Ok, sorry all to beleaguer this; I'm getting close but not seeing the cigar.
Here's my code and what I'm getting. (I'll post as clear an explanation of what I'm trying to do afterwards - some folks have said I wasn't clear enough to begin with.)
if($xref->att('keyref')){
my($h) = $linktext{$xref->att('keyref')}; # the keyref att is the key
+ previously defined for the %linktext hash
my($count);
foreach my $i (@$h){
$count++;
print "child $count:\n";
$i->print;
print $/;
$xref->copy->paste(last_child=>$i); # this is where I must be doing
+something wrong!
}
$xref->print;
}
The results:
child 1:
<keyword conref="ds"/>
child 2:
Database-
child 3:
<b>level</b>
child 4:
privileges
<xref keyref="ids_sqs_0147"></xref>
As you can see nothing is changing - the copy-paste doesn't seem to be working, the children are not getting inserted, though they're clearing displaying correctly with each $i->print statement. What am I doing wrong?
Only read the following if you want to get a clearer explanation of what I'm trying to do.
I have a number of "reference" files that each contain hundreds of citeReference elements. I am interested in two attributes - keys and href - and anything contained inside the child linktext element. For example:
<citeReference
keys="ids_sqs_0147"
href="../com.ibm.sqls.doc/ids_sqs_0147.dita#ids_sqs_0147">
<linktext>
<keyword conref="ds"/>
Database-<b>level</b> privileges
</linktext>
</citeReference>
My script uses XML::Twig to read each citeReference element and store its children in a referenced hash called %linktext.
my @children = $citeReference->children;
$linktext{citeReference->att('keys')} = \@children;
Elsewhere I have hundreds of files with xref elements, with a keyref attribute that matches the keys attribute of the citeReference. For example:
<xref keyref="ids_sqs_0147">some existing text that should get replaced</xref>
What I want to do is replace keyref with the href from the citeReference element, and insert the linktext inside of the xref, including its text and child elements.
<xref href="../com.ibm.sqls.doc/ids_sqs_0147.dita#ids_sqs_0147">
<keyword conref="ds"/>
Database-<b>level</b> privileges
</xref>
My script matches the keyref attribute (e.g. "ids_sqs_0147") which corresponds to the keys attribute, and dereferences it to an array. This is where I'm not seeing what I want.
if($xref->att('keyref')){
my($h) = $linktext{$xref->att('keyref')};
my($count);
foreach my $i (@$h){
$count++;
print "child $count:\n";
$i->print;
print $/;
$xref->copy->paste(last_child=>$i);
}
$xref->print;
}
The results:
child 1:
<keyword conref="ds"/>
child 2:
Database-
child 3:
<b>level</b>
child 4:
privileges
<xref keyref="ids_sqs_0147">Database-level privileges</xref>
As you can see nothing is changing - the cut-paste doesn't seem to be working. What am I doing wrong?
Thanks - and sorry to be dense here.
|