xquery - 使用 XQuery 标准化 XML 每个元素中的空间

标签 xquery marklogic marklogic-8

我有这样的 XML -

<a:price-range xmlns:c="http://iddn.icis.com/ns/core" xmlns:f="http://iddn.icis.com/ns/fields" xmlns:a="http://iddn.icis.com/ns/assets" xmlns:r="http://iddn.icis.com/ns/refdata">
    <c:id>
        http://iddn.icis.com/series-item/petchem/4021090-pricehistory-19990730000000</c:id>
    <c:type>series-item</c:type>
    <f:assessment-low>8.946586935</f:assessment-low>
    <f:assessment-high>9.946586935</f:assessment-high>
    <f:mid>9.44658693500000000000</f:mid>
    <f:period-label>
        <c:l10n xml:lang="en"/>
    </f:period-label>
</a:price-range>

我想标准化 XML 中的空间。与上面的示例一样,c:id 元素中有空格。规范化空格后,上面的 XML 将如下所示 -

<a:price-range xmlns:c="http://iddn.icis.com/ns/core" xmlns:f="http://iddn.icis.com/ns/fields" xmlns:a="http://iddn.icis.com/ns/assets" xmlns:r="http://iddn.icis.com/ns/refdata">
    <c:id>http://iddn.icis.com/series-item/petchem/4021090-pricehistory-19990730000000</c:id>
    <c:type>series-item</c:type>
    <f:assessment-low>8.946586935</f:assessment-low>
    <f:assessment-high>9.946586935</f:assessment-high>
    <f:mid>9.44658693500000000000</f:mid>
    <f:period-label>
        <c:l10n xml:lang="en"/>
    </f:period-label>
</a:price-range>

我查看了fn:normalise-space ,但它仅适用于字符串。

最佳答案

我认为通过应用序列化选项这是不可能的,您必须遍历应用 transformation pattern 的树。该页面的一个稍微调整过的示例,用于标准化空间并支持命名空间:

declare function local:copy($node as node()) as node() {
  typeswitch($node)
    case $text as text()
      return text { normalize-space($text) }
    case $element as element()
      return
        element { QName(namespace-uri($element), name($element)) } {
                  $element/@*,
                  for $child in $element/(* | text()) return local:copy($child)
                }
    default return $node
 };


local:copy(
  <a:price-range xmlns:c="http://iddn.icis.com/ns/core" xmlns:f="http://iddn.icis.com/ns/fields" xmlns:a="http://iddn.icis.com/ns/assets" xmlns:r="http://iddn.icis.com/ns/refdata">
    <c:id>
        http://iddn.icis.com/series-item/petchem/4021090-pricehistory-19990730000000</c:id>
    <c:type>series-item</c:type>
    <f:assessment-low>8.946586935</f:assessment-low>
    <f:assessment-high>9.946586935</f:assessment-high>
    <f:mid>9.44658693500000000000</f:mid>
    <f:period-label>
        <c:l10n xml:lang="en"/>
    </f:period-label>
  </a:price-range>
)

Marklogic 还允许apply an XSLT stylesheet ,这可能是使用 <xsl:strip-space elements="*"/> 这样做的更优雅的版本正如@Raj 提议的。

关于xquery - 使用 XQuery 标准化 XML 每个元素中的空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37670780/

相关文章:

xml - 如何从数据库 marklogic 获取文档 uri 名称列表?

MySQL xml与列数据比较

xquery - 如何在 MarkLogic 中重命名文档?

javascript - 对象节点到元素节点的转换失败?

azure - MarkLogic - XDMP-HOSTOFFLINE : Host is offline or not responding

SPARQL 查询导致 XDMP-MEMCANCELED

replication - 我们可以在不同版本的 marklogic 之间建立森林或数据复制吗?

sql-server - MSSQL XML 性能问题

MarkLogic 计划备份失败,因为备份操作已在进行中

marklogic - MarkLogic 是否支持使用 AWS Elastic File System 进行共享磁盘故障转移?