我正在使用 XML::Twig::XPath来处理ITS数据,并试图弄清楚如何使用变量来解析XPath表达式.以下是我需要与ITS spec合作的一个例子: its:rules version="2.0" its:param name="LCID"0x0409/its:param its:translate
<its:rules version="2.0"> <its:param name="LCID">0x0409</its:param> <its:translateRule selector="//msg[@lcid=$LCID]" translate="yes"/> </its:rules>
我需要能够评估选择器中包含的XPath表达式,变量的值是其: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);