我目前正在学习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文件并:
类似于给定的示例:优先级:B3,B1,B2,B4。
就是这样,我知道这并不容易(我认为),所以我真的很想了解如何编写查询来实现上述所有指示的脚本。
非常非常感谢您能帮助我。
使用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] 删除。
我来说两句