如果您使用命名空间的各种值,您可以看到,顶部级别命名空间由于您所做的声明而被声明和包含,在子元素级别,此信息不会以您期待的方式使用.
XQuery正在根据在该执行循环中被考虑的节点中使用的命名空间来提取命名空间,而与整个文档无关.这就是为什么每次XQuery循环时都会重新声明.
其他文章解释说,你所要做的就是“解析”数据以及“提取”它,这在一定程度上是真的,所以XSLT是正确的工具,而不是XQuery.
我发现一个外部链接,它具有剥离命名空间的XQuery方式,因此返回“raw”XML是here.
将该代码应用到您的XQuery已经让我:
SELECT xmlquery('xquery version "1.0"; (: :)
declare default element namespace
"http://www.somewherein.uk/ns/1.0"; (: :)
declare function local:strip-namespace($inputRequest as element()) as element()
{
element {xs:QName(local-name($inputRequest ))}
{
for $child in $inputRequest /(@*,node())
return
if ($child instance of element())
then local:strip-namespace($child)
else $child
}
}; (: :)
{
for $s in /*:patent/*
return local:strip-namespace($s)
}
'
PASSING cmf.XML_DATA
RETURNING content)
FROM XML_DOCUMENT_TMP cmf WHERE cmf.DOCUMENT_ID=1
一些进一步的编辑让我到下面,我认为是你以后(在专利级定义的命名空间)
SELECT xmlquery('xquery version "1.0"; (: :)
declare default element namespace
"http://www.somewherein.uk/ns/1.0"; (: :)
declare function local:strip-namespace($inputRequest as element()) as element()
{
element {fn:name($inputRequest)}
{
for $child in $inputRequest /(@*,node())
return
if ($child instance of element())
then local:strip-namespace($child)
else $child
}
}; (: :)
{
for $s in /(*:patent, node())
return local:strip-namespace($s)
}
'
PASSING cmf.XML_DATA
RETURNING content)
FROM XML_DOCUMENT_TMP cmf WHERE cmf.DOCUMENT_ID=1;
如下所述,由于XPath中的一些问题,导致循环代码中的一些重复.这也意味着txsm命名空间被声明了几次; XQuery声明它是“第一次”遇到使用它的命名空间,因为它走那棵树分支意味着如果有兄弟姐妹使用ns,那么它将被声明多次.通过将声明的显式布局移回到父节点,我们可以消除这一点.
SELECT xmlquery('xquery version "1.0"; (: :)
declare default element namespace "http://schemas.thomson.com/ts/20041221/tsip"; (: :)
declare namespace tsip="http://schemas.thomson.com/ts/20041221/tsip"; (: :)
declare namespace tsxm="http://schemas.thomson.com/ts/20041221/tsxm"; (: :)
declare function local:strip-namespace($inputRequest as element()) as element()
{
element {fn:name($inputRequest)}
{
for $child in $inputRequest /(@*,node())
return
if ($child instance of element())
then local:strip-namespace($child)
else $child
}
}; (: :)
{
for $s in /*:patent/*
return local:strip-namespace($s)
}
'
PASSING cmf.XML_DATA
RETURNING content)
FROM XML_DOCUMENT_TMP cmf WHERE cmf.DOCUMENT_ID=1;