xquery 相关问题

XQuery是一种用于查询和操作XML数据的函数式语言。它是XPath的超集,它添加了诸如创建新节点和更强大的FLWOR表达式等功能。虽然它与XSLT共享其数据模型,但XQuery针对查询而非转换数据进行了优化,因此它具有受SQL启发的不同设计。

XPath 匹配数组中的所有元素

我正在尝试编写一个条件,如果元素包含预定义列表中的所有属性但我似乎无法正确获取 XPath。 示例数据: 让 $元素 := 我正在尝试编写一个条件,如果元素包含预定义列表中的所有属性但我似乎无法正确获取 XPath。 示例数据: let $element := <country type="" class="" ref="" ana=""/> return if($element/@*[local-name() = ('type', 'class', 'ref', 'ana')]) then 'All attributes are present' else 'You can add attributes' 如果存在任何属性,第一个条件返回 true,我不确定正确的 XPath 是什么以确保它们都存在。 谢谢, 薇诺娜

回答 0 投票 0

在 shell 中运行 Saxon 以执行 XQuery 导致线程“main”中出现异常 java.lang.NoClassDefFoundError: org/xmlresolver/Resolver

遵循这个答案: 猫 xquery.txt 声明命名空间 w = "http://schemas.openxmlformats.org/wordprocessingml/2006/main"; 复制 $input := doc("/tmp/file.xml") 修改删除节点$

回答 1 投票 0

xidel:在 shell 中使用 XQuery 删除节点

示例 XML: 1234 金 斯科特 价值1 示例 XML: <outerTag> <innerElement> <Id>1234</Id> <fName>Kim</fName> <lName>Scott</lName> <customData1>Value1</customData1> <customData2>Value2</customData2> <position>North<position> <title/> </innerElement> <innerElement> <Id>5678</Id> <fName>Brian</fName> <lName>Davis</lName> <customData3>value3</customData3> <customData4>value4</customData4> <customData5>value5</customData5> <position>South<position> <title/> </innerElement> </outerTag> 预期产出: <outerTag> <innerElement> <Id>1234</Id> <fName>Kim</fName> <lName>Scott</lName> <customData1>Value1</customData1> <customData2>Value2</customData2> <position>North<position><title/></position> </position> </innerElement> </outerTag> 我知道我可以只使用好的选择Xpath来做这个把戏,但我试图弄清楚如何使用delete和xidel来正确XQuery。 我从this试过: xidel --xml -e ' let $element := //innerElement[not(Id["1234"])] declare function local:process-xml ($element) { $element update delete node } ' file.xml 我得到: An unhandled exception occurred at $00000000006174CA: ERangeError: Range check error $00000000006174CA $000000000061782C $0000000000629536 $000000000062E638 $000000000055C12B 或 $ xidel --xquery ' let $element := //innerElement[./not(Id["1234"])] declare function local:process-xml ($element) { $element update delete node } ' file.xml 我得到同样的错误。 或者使用 纯 XQuery: $ xidel --xml --xquery ' let $input := /outerTag modify delete node $input/innerElement[Id ne "1234"] return $input ' file.xml 我得到错误: Error: err:XPST0003: Missing whitespace or symbol in line 2 column 5 modify delete node $input/innerElement[Id ne "1234"] ^^^^ error occurs around here 令人沮丧xidel无法处理这种纯粹的XQuery解决方案。 这里是一个纯 XQuery 解决方案,在 BaseX 10.5 中测试 XQuery declare context item := document { <outerTag> <innerElement> <Id>1234</Id> <fName>Kim</fName> <lName>Scott</lName> <customData1>Value1</customData1> <customData2>Value2</customData2> <position>North</position> <title/> </innerElement> <innerElement> <Id>5678</Id> <fName>Brian</fName> <lName>Davis</lName> <customData3>value3</customData3> <customData4>value4</customData4> <customData5>value5</customData5> <position>South</position> <title/> </innerElement> </outerTag> }; copy $input := . modify delete node $input/outerTag/innerElement[Id ne "1234"] return $input 输出 <outerTag> <innerElement> <Id>1234</Id> <fName>Kim</fName> <lName>Scott</lName> <customData1>Value1</customData1> <customData2>Value2</customData2> <position>North</position> <title/> </innerElement> </outerTag> XQuery #2 以文件名作为参数 declare base-uri 'e:\Temp\'; declare option db:stripws "true"; copy $input := doc("input.xml") modify delete node $input/outerTag/innerElement[Id ne "1234"] return $input Linux 版本: copy $input := doc("/tmp/file.xml") modify delete node $input/outerTag/innerElement[Id ne "1234"] return $input Xidel 不支持“XQuery 更新”。参见邮件列表讨论。 附带说明:虽然可以使用 Xidel 编辑 XML,但它的目标不是成为一个完全成熟的编辑器。 Benito 创建 Xidel 的初衷是作为提取器。 你可以使用transform(),但是wiki已经很久没有更新了,目前这个功能已经被弃用了: $ xidel -s file.xml -e ' transform( /, function($x){ if (name($x)="innerElement" and $x/Id="5678") then () else $x } ) ' --output-node-format=xml --output-node-indent pxp:transform(..) is deprecated, use x:transform-nodes(..) <outerTag> <innerElement> <Id>1234</Id> <fName>Kim</fName> <lName>Scott</lName> <customData1>Value1</customData1> <customData2>Value2</customData2> <position>North</position> <title/> </innerElement> </outerTag> 相反,我会推荐x:replace-nodes(),它更容易使用: $ xidel -s file.xml -e 'x:replace-nodes(//innerElement[Id="5678"],())' \ --output-node-format=xml --output-node-indent 来自xidel doc的尝试示例: $ xidel --xml -e ' let $delete := //innerElement[not(Id="1234")] return transform(/, function($e){ $e[not($delete[$e is .])]}) ' file.xml 看起来有点复杂 编辑:此语法现已弃用。 如果这可以简化或使用普通的纯XQuery作为这个答案.将接受另一个答案

回答 3 投票 0

xidel:使用 XQuery 删除节点

示例 XML: 1234 金 斯科特 价值1 示例 XML: <outerTag> <innerElement> <Id>1234</Id> <fName>Kim</fName> <lName>Scott</lName> <customData1>Value1</customData1> <customData2>Value2</customData2> <position>North<position> <title/> </innerElement> <innerElement> <Id>5678</Id> <fName>Brian</fName> <lName>Davis</lName> <customData3>value3</customData3> <customData4>value4</customData4> <customData5>value5</customData5> <position>South<position> <title/> </innerElement> </outerTag> 预期产出: <outerTag> <innerElement> <Id>1234</Id> <fName>Kim</fName> <lName>Scott</lName> <customData1>Value1</customData1> <customData2>Value2</customData2> <position>North<position><title/></position> </position> </innerElement> </outerTag> 我从this试过: xidel --xml -e ' let $element := //innerElement[./Id[text()="1234"]]//innerElement declare function local:process-xml ($element) { $element update delete node } ' file.xml 我得到: An unhandled exception occurred at $00000000006174CA: ERangeError: Range check error $00000000006174CA $000000000061782C $0000000000629536 $000000000062E638 $000000000055C12B 或 $ xidel --xquery ' let $element := //innerElement[./Id[text()="1234"]]//innerElement declare function local:process-xml ($element) { $element update delete node } ' file.xml 我得到同样的错误。 来自xidel doc的尝试示例: xidel --xml -e ' let $delete := //innerElement[./Id[text()="1234"]]//innerElement return transform(/, function($e){ $e[not($delete[$e is .])]}) ' file.xml 但它给了我所有的 XML 树,没有删除节点。 与xmlstarlet是that简单如: $ xmlstarlet format --recover file 2>/dev/null | xmlstarlet ed -d '//innerElement[./Id[text()="1234"]]//innerElement' 找到方法: xidel --xml -e ' let $delete := (//innerElement)[2] return transform(/, function($e){ if ($delete[$e is .]) then () else $e }) ' -e '//innerElement[text()="1234"]' file.xml 如果可以简化,将接受另一个答案

回答 1 投票 0

使用 SaxonJS 2.5(浏览器)的 XQuery 3.1 评估

我想要的 我需要创建一个 Javascript 函数,以获取针对 XML 评估 XQuery 3.1 表达式的结果。 功能: 必须接收两个参数:XML 文档 (

回答 1 投票 0

我得到一个无效的 XQuery 语法,语法没有通过使用 java 的静态验证错误

我收到此错误:无效的 XQuery 语法,语法未通过静态验证。 eac4.gestor.GestorException 在 eac4.gestors.GestorOrdinador.inserir(GestorOrdinador.java:57) 在 eac4.gestors.

回答 2 投票 0

XQuery 在 oXygen 中运行时能否构建并保存输出文档?

我在 oXygen 中运行 XQuery 3.1 以从输入 XML 创建输出 HTML。 在 eXist-DB 中运行 XQuery 时,可以将其中的 html 框架和 FLWOR 语句声明为变量,

回答 1 投票 0

在 SQL Server 中列出所有带有命名空间前缀的 xml 节点

我想列出 SQL Server 中所有带有命名空间前缀的 xml 节点。 以下查询的结果不包含节点的命名空间前缀。是否可以将 cbc:ID 列为 "c...

回答 0 投票 0

使用 Xquery 将 XML 转换为 CSV

我需要将下面的 XML 转换为 CSV,这样对于空 xml 标记,CSV 文件中不能有任何逗号。 例如,考虑下面的 XML 1

回答 1 投票 0

从按列而非行组织的 SQL 创建类似 XML 的输出

我正在寻找一种有效的方法来生成看起来像 XML 的输出,按来自 SQL Server 2016 的原始数据列分组,针对特定的输出格式。 -- DDL 和示例数据填充...

回答 1 投票 0

从按列而非行组织的 SQL 创建 XML

我正在寻找一种有效的方法来生成按 SQL Server 2016 中的原始数据列分组的 XML 输出,针对特定的输出格式。 -- DDL 和示例数据填充,开始 声明...

回答 0 投票 0

在 SQL 中操作标签名称和输出结构 - 第二部分

(这是 Yitzhak Khabinsky 很好地回答了在 SQL 中操作标签名称和输出结构的后续) 我正在尝试从特定 XML 格式的 Microsoft SQL Server 2016 中提取数据...

回答 1 投票 0

在 SQL 中操作标签名称和输出结构

我有一个生成一行的 SQL 查询,其中包含来自 Microsoft SQL Server 2016 的多列。 我正在尝试以 XML 格式生成输出,并且可以使用 SQL XML 基本参数来获取变量...

回答 1 投票 0

如何组合打印不同字段的值?

我正在使用 xidel 并玩网页抓取(目前没有模板)。 我想获得一本书的标题和价格及其价格,以便每个条目都可以打印在一行上: 标题...

回答 3 投票 0

如何在 xquery 中的每个 for 循环迭代中找到下一个索引的值

xquery 版本“1.0-ml”; import module namespace admin = "http://marklogic.com/xdmp/admin" 在“/MarkLogic/admin.xqy”; 声明变量 $totalhosts := xdmp:host-nam...

回答 0 投票 0

每次在xquery的for循环中增加索引的位置值

声明变量 $eachPhase := 5; 对于 $h 在 $p 在 $t 其中 $p=1 返回 $f 在 $phases 中 let $f-name := fn:concat($f, "of-phase") 返回 如果($eachPhase gt 5)那么 ...

回答 0 投票 0

XML数据转SQL表,获取子节点数据困难

我有一个要加载到 SQL 中的 xml 文件。我可以毫无问题地加载 xml 文件并将顶级节点放入 sql 表中。我很难到达下一级子节点。 ...

回答 1 投票 0

如何将 request:get-parameter 的值传递给 Xquery 中的变量,以便在 XSLT 模板中使用以生成 HTML 输出

我有这个 xml 文件: 爸爸 我有这个 xml 文件: <A9-ArchaeologicalExcavation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <E53-Place> <Name>asdad</Name> <District/> <Parish/> <Gps> <Latitude/> <Longitude/> </Gps> <A2-StratigraphicVolumeUnit> <Timeline/> <Description/> <Gps> <Latitude/> <Longitude/> </Gps> <S19-EncounterEvent> <Date>2001-11-12</Date> <E24-PhysicalManThing Inventory_number="1"> <E36-VisualItem/> <Order_number>Triangular</Order_number> <Group> <Group-name>Reta</Group-name> <Sub_type>true</Sub_type> </Group> <E3-ConditionState> <E55-Type/> </E3-ConditionState> <E55-Type>Alongado</E55-Type> <Variant>Espessa</Variant> <Typometry Unit="mm"> <Lenght>23</Lenght> <Width>12</Width> <Thickness>5</Thickness> <Body_lenght>19</Body_lenght> <Base_lenght>4</Base_lenght> </Typometry> <Morphology> <Point>true</Point> <Body>false</Body> <Base>Triangular</Base> </Morphology> <Retouch> <Location/> <Mode/> <Amplitude/> <Direction/> <Delineation/> <Orientation/> <Shape/> </Retouch> <Raw_material/> <Observations/> </E24-PhysicalManThing> </S19-EncounterEvent> </A2-StratigraphicVolumeUnit> </E53-Place> </A9-ArchaeologicalExcavation> 我有一个网页,我想在其中搜索匹配的某些项目,假设 variant = 'Espessa' 并返回所有 @Inventory_number。 我使用 GET 传递插入到我的 html 表单中的值,然后我想创建一个 Xquery 代码来接收这些值,将这些值传递到 XSLT 代码中并返回一个包含找到的项目的 html 文件。 到目前为止,我的 Xquery 中有这个: xquery version "3.0" encoding "UTF-8"; declare variable $fi as xs:integer :=5; declare variable $fi2 as xs:string := "variant"; let $fi:= request:get-parameter("termo", 5) let $fi2 :=request:get-parameter("elementos", "variant") let $x := doc("/db/apps/MegaLOD/arrowheads/arrowheads.xml") let $filter := concat($fi2, " = ", $fi, "") for $arrowheads in $x/arrowheads let $arrowhead_list := (for $arrowhead in $arrowheads/arrowhead[$filter] return $arrowhead) return <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>Arrowheads</h2> <xsl:for-each select="A9-ArchaeologicalExcavation/E53-Place/A2-StratigraphicVolumeUnit/S19-EncounterEvent/E24-PhysicalManThing[Variant = 'Espessa']"> <p><xsl:value-of select="@Inventory_number"/></p> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet> 我决定首先尝试使用固定值,Variant = 'Espessa',但查询返回一个空页面。 我想在我的 XSLT 代码中使用变量 $fi 和 $fi2。 我的代码有什么问题? 如何在 xslt 代码中使用 $fi 和 $fi2 变量? 您需要实际评估来自 XQuery 的 XSLT,这可以通过调用 transform#1 函数来完成 - 请参阅:https://www.w3.org/TR/xpath-functions-31/#func-transform。从 XQuery 向 XSLT 传递参数有多种选择,但我将在此处仅包括一个这样的选项,我使用 xsl:param. 你的$filter谓词也有一些问题。恐怕XML不是由key=value对组成的,而是一棵树and,所以谓词需要查询树中正确的节点。 xquery version "3.1" encoding "UTF-8"; declare variable $default-elementos := "Variant"; declare variable $default-termo := "Espessa"; let $elementos :=request:get-parameter("elementos", $default-elementos) let $termo:= request:get-parameter("termo", $default-termo) let $matches := doc("/db/apps/MegaLOD/arrowheads/arrowheads.xml")//element()[local-name(.) = $elementos][. eq = $termo] let $things := $matches/parent::element() let $xslt := <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> <xsl:param name="elementos" required="yes"/> <xsl:param name="termo" required="yes"/> <xsl:template match="results"> <html> <body> <div> <p><b>Elementos:</b> <xsl:copy-of select="$elementos"/></p> <p><b>Termo:</b> <xsl:copy-of select="$termo"/></p> </div> <h2>Arrowheads</h2> <xsl:apply-templates select="node() | @*"/> </body> </html> </xsl:template> <xsl:template match="E24-PhysicalManThing"> <p> <xsl:value-of select="@Inventory_number"/> </p> </xsl:template> <!-- Fall through to identity transform --> <xsl:template match="node() | @*"> <xsl:copy> <xsl:apply-templates select="node() | @*"/> </xsl:copy> </xsl:template> </xsl:stylesheet> return transform(map { "stylesheet-node": $xslt, "source-node": <results>{$things}</results>, "stylesheet-params": map { "elementos": $elementos, "termo": $termo } }) 我已经对您要实现的目标做出了一些假设,但希望这对您来说是一个很好的例子。随时提出任何其他问题...

回答 1 投票 0

使用 T-SQL Xquery 从 XML 中提取数据,其中低 ASCII 表示为“”?或者只使用 T-SQL?

我在 XML 中有包含低位 ASCII 的字符串。具体来说,EDI 包含特殊字符,如 char(28)、char(29)、char(30)(也称为文件分隔符/组分隔符/记录分隔符)。 T...

回答 3 投票 0

查询在sql服务器中只改变最后一条记录的值。

我在sql服务器上有一个带有XML数据类型的表。我想改变其中一个属性的值。

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.