xml - XML::Twig 或其他中的 XPath 变量

标签 xml perl xpath xml-twig xml-libxml

我正在使用 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/

相关文章:

Android - 如何使用 2 种语言的字符串的 2 'values' 文件夹?

python - 转义字符串以在 XML 中使用

ruby - bash 管道在 ruby​​ #system 中不起作用,并且在 ruby​​ Shell#system 中不起作用

c# - 通过 xml 文档中的内部文本查找 xml 节点

android - xmlns :android ="http://schemas.android.com/apk/res/android" this line is marked as error in Linear Layout

java - 不要在 JLabel 中使用 XML 文件读取 '&lt;'

web-services - 如何构建 perl 网络服务基础架构

windows - "system"的 Perl Windows 替代品(打开多个进程)

xpath - 使用 xpath 定位名称中带有下划线的元素

java - Saxon XPathEvaluator 只返回第一个结果