BaseX:尝试在XQuery更新工具中的名称空间之间移动元素

BaseX:尝试在XQuery更新工具中的名称空间之间移动元素,xquery,basex,xquery-update,Xquery,Basex,Xquery Update,我想规范化XSD输入文件,将xs:放在任何没有xs:前缀的XSD元素之前 copy $c:=doc("test.xsd") modify ( if($c/schema) then ( for $item in $c//* where substring($item/text(), 1, 3) != "xs:" return rename node $item as concat("xs:", $item/text()) ) else () ) retu

我想规范化XSD输入文件,将xs:放在任何没有xs:前缀的XSD元素之前

copy $c:=doc("test.xsd")
modify
(
  if($c/schema)
  then
  (
    for $item in $c//*
    where substring($item/text(), 1, 3) != "xs:"
    return rename node $item as concat("xs:", $item/text())
  )
  else ()
)
return $c
在没有xs:prepend的输入XSD上运行此xqy将返回未更改的输入文件。我确实更新了$c并返回了它。那怎么了

输入文件:

<?xml version="1.0"?>
<schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<element name="note" type="xs:string"/>

</schema>
预期产出:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="note" type="xs:string"/>

</xs:schema>

附言:看来我的问题引起了混乱。我需要xs:present,因为我有另一个文本处理程序,它只处理带有xs:prefix的元素。

这应该可以工作,它与您的方法非常相似:

copy $doc := doc("test.xsd")
modify (
  if($doc/*:schema) then (
    for $item in $doc//*
    let $name := name($item)
    where not(starts-with($name, 'xs:'))
    let $new-name := xs:QName('xs:' || replace($name, '^.+:', ''))
    return rename node $item as $new-name
  )
  else ()
)
return $doc

您试图更新的内容根本不是文本节点,xs:不是文本前缀,而是名称空间别名。所以尝试匹配文本节点的子字符串毫无意义。也就是说,你真正想做的是,从XML文档语义的角度来看,任何BaseX查询的工作级别都是将默认命名空间中的元素替换为http://www.w3.org/2001/XMLSchema 名称空间…实际上,关于如何在XSLT中实现这一点有一些答案-请参阅ie。-但我无法在XQUF中帮助您这些方法可能会提供有用的提示——看看XQUF标准,复制命名空间也可以在那里关闭。顺便说一句,如果您的文档只是将默认命名空间设置为http://www.w3.org/2001/XMLSchema,那么您就不需要在所有内容上都使用xs:前缀。