我正在使用 XML::Twig::XPath使用 ITS 数据,并试图弄清楚如何解析其中包含变量的 XPath 表达式。这是我需要从 ITS spec 中使用的示例:
<its:rules version="2.0">
<its:param name="LCID">0x0409</its:param>
<its:translateRule selector="//msg[@lcid=$LCID]" translate="yes"/>
</its:rules>
我需要能够评估 selector
中包含的 XPath 表达式,变量的值是 its:param
元素的内容。我不知道该怎么做。 XML::XPath 的文档提到变量(我假设它应该是上下文的一部分),它甚至有一个类来表示它们,但文档没有说明如何在上下文中指定变量。如果可能的话,我会更加不确定如何从 XML::Twig 访问此类功能。
有人知道怎么做吗?或者,您能否举例说明如何将此类功能与另一个模块一起使用,例如 XML::LibXML(它广泛地提到了变量,但让我有点不确定如何使用字符串变量来做到这一点)?
最佳答案
libxml2 和 XML::LibXML 支持 XPath 2.0 路径及其变量。
use XML::LibXML qw( );
use XML::LibXML::XPathContext qw( );
sub dict_lookup {
my ($dict, $var_name, $ns) = @_;
$var_name = "{$ns}$var_name" if defined($ns);
my $val = $dict->{$var_name};
if (!defined($val)) {
warn("Unknown variable \"$var_name\"\n");
$val = '';
}
return $val;
}
my $xml = <<'__EOI__';
<r>
<e x="a">A</e>
<e x="b">B</e>
</r>
__EOI__
my %dict = ( x => 'b' );
my $parser = XML::LibXML->new();
my $doc = $parser->parse_string($xml);
my $xpc = XML::LibXML::XPathContext->new();
$xpc->registerVarLookupFunc(\&dict_lookup, \%dict);
say $_->textContent() for $xpc->findnodes('//e[@x=$x]', $doc);
关于xml - XML::Twig 或其他中的 XPath 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17287749/