XQuery是一种用于查询和操作XML数据的函数式语言。它是XPath的超集,它添加了诸如创建新节点和更强大的FLWOR表达式等功能。虽然它与XSLT共享其数据模型,但XQuery针对查询而非转换数据进行了优化,因此它具有受SQL启发的不同设计。
我正在尝试编写一个条件,如果元素包含预定义列表中的所有属性但我似乎无法正确获取 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 是什么以确保它们都存在。 谢谢, 薇诺娜
遵循这个答案: 猫 xquery.txt 声明命名空间 w = "http://schemas.openxmlformats.org/wordprocessingml/2006/main"; 复制 $input := doc("/tmp/file.xml") 修改删除节点$
示例 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作为这个答案.将接受另一个答案
示例 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 如果可以简化,将接受另一个答案
使用 SaxonJS 2.5(浏览器)的 XQuery 3.1 评估
我想要的 我需要创建一个 Javascript 函数,以获取针对 XML 评估 XQuery 3.1 表达式的结果。 功能: 必须接收两个参数:XML 文档 (
我得到一个无效的 XQuery 语法,语法没有通过使用 java 的静态验证错误
我收到此错误:无效的 XQuery 语法,语法未通过静态验证。 eac4.gestor.GestorException 在 eac4.gestors.GestorOrdinador.inserir(GestorOrdinador.java:57) 在 eac4.gestors.
XQuery 在 oXygen 中运行时能否构建并保存输出文档?
我在 oXygen 中运行 XQuery 3.1 以从输入 XML 创建输出 HTML。 在 eXist-DB 中运行 XQuery 时,可以将其中的 html 框架和 FLWOR 语句声明为变量,
在 SQL Server 中列出所有带有命名空间前缀的 xml 节点
我想列出 SQL Server 中所有带有命名空间前缀的 xml 节点。 以下查询的结果不包含节点的命名空间前缀。是否可以将 cbc:ID 列为 "c...
我需要将下面的 XML 转换为 CSV,这样对于空 xml 标记,CSV 文件中不能有任何逗号。 例如,考虑下面的 XML 1
我正在寻找一种有效的方法来生成看起来像 XML 的输出,按来自 SQL Server 2016 的原始数据列分组,针对特定的输出格式。 -- DDL 和示例数据填充...
我正在寻找一种有效的方法来生成按 SQL Server 2016 中的原始数据列分组的 XML 输出,针对特定的输出格式。 -- DDL 和示例数据填充,开始 声明...
(这是 Yitzhak Khabinsky 很好地回答了在 SQL 中操作标签名称和输出结构的后续) 我正在尝试从特定 XML 格式的 Microsoft SQL Server 2016 中提取数据...
我有一个生成一行的 SQL 查询,其中包含来自 Microsoft SQL Server 2016 的多列。 我正在尝试以 XML 格式生成输出,并且可以使用 SQL XML 基本参数来获取变量...
我正在使用 xidel 并玩网页抓取(目前没有模板)。 我想获得一本书的标题和价格及其价格,以便每个条目都可以打印在一行上: 标题...
如何在 xquery 中的每个 for 循环迭代中找到下一个索引的值
xquery 版本“1.0-ml”; import module namespace admin = "http://marklogic.com/xdmp/admin" 在“/MarkLogic/admin.xqy”; 声明变量 $totalhosts := xdmp:host-nam...
声明变量 $eachPhase := 5; 对于 $h 在 $p 在 $t 其中 $p=1 返回 $f 在 $phases 中 let $f-name := fn:concat($f, "of-phase") 返回 如果($eachPhase gt 5)那么 ...
我有一个要加载到 SQL 中的 xml 文件。我可以毫无问题地加载 xml 文件并将顶级节点放入 sql 表中。我很难到达下一级子节点。 ...
如何将 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 } }) 我已经对您要实现的目标做出了一些假设,但希望这对您来说是一个很好的例子。随时提出任何其他问题...
使用 T-SQL Xquery 从 XML 中提取数据,其中低 ASCII 表示为“”?或者只使用 T-SQL?
我在 XML 中有包含低位 ASCII 的字符串。具体来说,EDI 包含特殊字符,如 char(28)、char(29)、char(30)(也称为文件分隔符/组分隔符/记录分隔符)。 T...