Xml XQUERY:使用不同的参数多次查询查询的输出

Xml XQUERY:使用不同的参数多次查询查询的输出,xml,xquery,Xml,Xquery,我有很多XML文件,需要根据来自命令行的用户定义输入输出文件名 下面是一个简单的XQuery示例,它抓住了问题的本质 File1.xml <?xml version="1.0" encoding="utf-8"?> <Description> <FileName>File1</FileName> <Persons> <Person> <Name>Anna</Name>

我有很多XML文件,需要根据来自命令行的用户定义输入输出文件名

下面是一个简单的XQuery示例,它抓住了问题的本质

File1.xml

<?xml version="1.0" encoding="utf-8"?>
<Description>  
  <FileName>File1</FileName>
  <Persons>
    <Person>
      <Name>Anna</Name>
      <Age>25</Age>
    </Person>
    <Person>
      <Name>Marco</Name>
      <Age>25</Age>
    </Person>
    <Person>
      <Name>Mary</Name>
      <Age>13</Age>
    </Person>
  </Persons>
</Description>
输出:

<FileName>File1</FileName>
File1

提前感谢。

这里有一个可能的解决方案(假设您的XQuery处理器允许您将地图作为用户定义的输入进行传递):

第二种选择更接近于原始解决方案。名称和年龄绑定到单独的变量:

declare variable $NAMES external := ('Anna', 'Marco');
declare variable $AGES external := (25, 25);

for $description in collection('db')/Description
where every $test in for-each-pair($NAMES, $AGES, function($name, $age) {
  exists($description/Persons/Person[Name = $name and Age = $age])
}) satisfies $test
return $description/FileName

下面是一个可能的解决方案(假设您的XQuery处理器允许您将地图作为用户定义的输入进行传递):

第二种选择更接近于原始解决方案。名称和年龄绑定到单独的变量:

declare variable $NAMES external := ('Anna', 'Marco');
declare variable $AGES external := (25, 25);

for $description in collection('db')/Description
where every $test in for-each-pair($NAMES, $AGES, function($name, $age) {
  exists($description/Persons/Person[Name = $name and Age = $age])
}) satisfies $test
return $description/FileName

非常感谢。我只有一个问题,在一个真实的案例中,我有6个变量,而不是像这个案例中的2个,包括姓名和年龄。我认为想法会完全相同。我从你的答案中学到了很多,再次感谢你。谢谢!我只有一个问题,在一个真实的例子中,我有6个变量,而不是像这个例子中的2个,名字和年龄。我想这个想法会完全一样。我从你的答案中学到了很多,再次感谢你。
declare variable external $INPUT := map {
  'Anna': 25,
  'Marco': 25
};

for $description in collection('db')/Description
where every $test in map:for-each($INPUT, function($name, $age) {
  exists($description/Persons/Person[Name = $name and Age = $age])
}) satisfies $test
return $description/FileName
declare variable $NAMES external := ('Anna', 'Marco');
declare variable $AGES external := (25, 25);

for $description in collection('db')/Description
where every $test in for-each-pair($NAMES, $AGES, function($name, $age) {
  exists($description/Persons/Person[Name = $name and Age = $age])
}) satisfies $test
return $description/FileName