难以执行的xquery

塞塔

我目前正在学习xQuery语言,而在做一些练习时,我发现了一个我无法执行的查询。我真的希望你能帮助我。

我有n个排序文件,它们的“值”属性中具有相同的节点但具有不同的值,例如:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <source name="File1.txt">
        <line nr="1" value="13" />
        <line nr="2" value="10" />
        <line nr="3" value="5" />
    </source>
    <source name="File2.txt">
        <line nr="1" value="2" />
    </source>
</root>

我必须编写一个xquery来获取所有源标签,并且对于每个源标签,它将删除value属性小于10的行。

在这种情况下,结果将是:

<?xml version="1.0" encoding="UTF-8"?>
    <root>
        <source name="File1.txt">
            <line nr="1" value="13" />
            <line nr="2" value="10" />
        </source>
        <source name="File2.txt" />
    </root>

因此,对于每个xml文件,我都会生成一个新文件,就像上面的文件一样,我将其称为“ B”。

现在,我必须创建一个查询,该查询将创建一个新的唯一xml文件(我将其称为C),该文件将包含以下内容:假定每个B文件都有优先级(例如:B12> B10> B8> .. 。),我必须按顺序打开B文件并:

  1. 如果C中缺少源节点,则将其复制到内部。
  2. 对于每个线节点,添加一个名为“ pos”的新属性,该属性将表示B文件优先级中包含该行的第一个B文件在该源节点内部的位置。

类似于给定的示例:优先级:B3,B1,B2,B4。

  • 打开B3,对于每个源节点,将其复制到C文件中(这是第一个文件,因此将仅复制它们)
    • 对于该源节点内的每个行节点,复制所有行(这是第一行,因此我将只复制它们),并为每行添加值为1(优先级内B3的位置)的属性“ pos”。
  • 打开每个源节点的B1,如果C文件中缺少该节点,则将其复制到C文件中。
    • 对于该源节点内的每个行节点,复制所有缺少的行,并添加值为2的属性“ pos”。
  • 对于每个源节点,打开B2,如果C文件中缺少该节点,则将其复制到C文件中。
    • 对于该源节点内的每个行节点,复制所有缺少的行,并添加值为3的属性“ pos”。
  • 对于每个源节点,打开B4,如果C文件中缺少该节点,则将其复制到C文件中。
    • 对于该源节点内的每个行节点,复制所有缺少的行,并添加值为4的属性“ pos”。

就是这样,我知道这并不容易(我认为),所以我真的很想了解如何编写查询来实现上述所有指示的脚本。

非常非常感谢您能帮助我。

迈克尔·凯(Michael Kay)

使用XSLT实际上更容易进行这种查询,其中输出仅与输入相比有很小的变化。此外,XSLT能够在一次执行期间生成多个输出文件,而这在XQuery中是无法直接实现的。在XSLT 3.0中,这可能是:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0">

<xsl:mode on-no-match="shallow-copy"/>

<xsl:template match="line[@value lt 10]"/>

<xsl:template name="xsl:initial-template">
  <xsl:for-each select="collection('file:///input-dir')">
    <xsl:result-document href="{tokenize(document-uri(.), '/')[last()]}">
      <xsl:apply-templates/>
    </xsl:result-document>
  </xsl:for-each>
</xsl:template>

为此,最好在每个输入文件中执行一次查询,这意味着您需要某种外部语言的逻辑来迭代输入文件并为每个输入设置相应的输出文件。然后,您需要一个使用任何元素的递归函数,如果不是要删除的元素之一,则创建一个具有相同名称的新元素,复制属性,然后调用自身来处理子元素。因此可以完成,但是还有很多工作要做。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章