我的XML文件看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:element name="foo">
<xsl:value-of select="bar"/>
</xsl:element>
</xsl:stylesheet>
我正在使用XML:LibXML::Reader,并尝试在满足某些条件时在每个节点上执行逻辑。例如:
<xsl:element name="foo">
输出:
<xsl:element name="foobar">
这是我目前拥有的:
use strict;
use warnings;
use XML::LibXML::Reader;
my $reader = XML::LibXML::Reader->new(location => "test.xml") or die "cannot read input filen";
while ($reader->read){
processNode($reader);
}
sub processNode{
my $reader = shift;
printf "%sn", ($reader->name);
}
我的输出如下所示:
xsl:stylesheet
#text
xsl:element
#text
xsl:value-of
#text
xsl:element
#text
xsl:stylesheet
好的,这里的问题是 - 你本质上误解了XML的树性质。你有一堆节点 - "你在"行走",但实际上xsl:stylesheet
节点是xsl:element
节点的父节点。
到目前为止,最简单的方法是不要按照你的方式去做,而是:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::LibXML;
my $reader = XML::LibXML->load_xml(location => "test.xml") or die "cannot read input filen";
print $reader -> toString
但我很确定你的要求稍微复杂一些。
编辑:果然是这样。
所以 - 将每个"foo"名称更改为"foobar"名称:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::LibXML;
my $reader = XML::LibXML->load_xml(location => "test.xml") or die "cannot read input filen";
my $xpath_context = XML::LibXML::XPathContext->new($reader);
foreach my $foo_node ( $xpath_context -> findnodes('//xsl:element[@name="foo"]') ) {
$foo_node -> setAttribute ( 'name', 'foobar' );
}
print $reader -> toString