2

第一次在这里发帖,所以如果我做错了什么,请不要犹豫,让我知道。

我正在使用 Altova Stylevision 打印表单文档,并且我需要为每个唯一的两个节点集合集打印一份表单副本。下面是一个示例 XML,可以更好地解释我的要求。

<form>
    <Animals>
        <Animal>
            <AName>Boomer</AName>
            <AAddress>House</AAddress>
        </Animal>
        <Animal>
            <AName>Growl</AName>
            <AAddress>Street</AAddress>
        </Animal>
        <Animal>
            <AName>Incognito</AName>
            <AAddress>Nowhere</AAddress>
        </Animal>
    </Animals>
    <People>
        <Person>
            <PName>Willy</PName>
            <PAddress>123 Common Lane</PAddress>
        </Person>
        <Person>
            <PName>Wonka</PName>
            <PAddress>Chocolate Factory</PAddress>
        </Person>
    </People>
</form>

我想从上面的示例中生成 6 个唯一值(笛卡尔积),其中包含每个组合<Animal>并且<Person>它们都不为空。因此,此示例的输出将类似于(仅显示分组,需要所有子节点而不仅仅是名称):

([Boomer, Willy], [Boomer, Wonka], [Growl, Willy], [Growl, Wonka], [Incognito, Willy], [Incognito, Wonka])

编辑: 我正在尝试获取节点,而不仅仅是<Name>元素值。因为我在这个模板中包装了整个 StyleVision 表单,所以范围应该在<Animal>and<Person>级别。这样,在表格中,我可以说并在表格的每个副本上/AName, /PName,获得一个值。它应该充当元素节点的 6 个实例,每个实例代表和的唯一组合。/AName/PName<Person><Animal>

我查看了for # in # return语法,但无法弄清楚如何返回唯一集。以下是我到目前为止尝试过的:

for $a in form/Animals/Animal, $p in form/People/Person return ($a, $p)

form/Animals/Animal | form/People/Person

谁能指出我正确的方向?

谢谢!

4

1 回答 1

1

更新

您的for表达式是正确的,您只需要添加一个元素构造函数即可获得所需的结果:

for $animal in $x/Animals/Animal,
    $person in $x/People/Person
return element union { $animal, $person }

元素名称(union在示例中)可以是您想要的任何名称。


这些原始代码示例将从问题中生成结果字符串。

这有点难以阅读,但这会做你想要的:

concat("(",
  concat(string-join(
    for $animal in /form/Animals/Animal/Name,
        $person in /form/People/Person/Name
    return concat("[", concat(string-join(($animal, $person), ", "), "]")), ", "), ")"))

如果可以使用 XPath/XQuery 3.0 处理器,则可以使用||连接运算符而不是concat函数调用,这(在某种程度上)更具可读性:

"(" ||
  string-join(
    for $animal in /form/Animals/Animal/Name,
        $person in /form/People/Person/Name
    return "[" || string-join(($animal, $person), ", ") || "]"
    , ", ")
|| ")"
于 2013-12-19T17:44:15.863 回答