xml - 如何获取单个 XML 元素的所有 namespace 声明

标签 xml xpath xquery

如何使用 XPath 查询(甚至 XQuery)获取单个元素的命名空间前缀声明?我想检查它们是否在不止 1 个地方被定义。

例如,对于第一个元素,它将是 xmlns 和 xmlns:n,对于第二个只有 xmlns;对于第一个 < n:int> 什么都不是,等等。

我只能找到these我只能获得正在使用的命名空间,但不是我真正想要的。

<?xml version="1.0" encoding="UTF-8"?>
    <root>
        <plus xmlns="http://lalaivana.me/calc/"
            xmlns:n="http://lalaivana.me/numbers/" >
            <n:int value="4"/>
            <n:int value="5"/>
        </plus>
        <plus xmlns="http://lalaivana.me/calc/">
            <int value="4" xmlns="http://lalaivana.me/numbers/" />
            <int value="5"/>
        </plus>
    </root>

最佳答案

您可以使用函数 in-scope-prefixes()namespace-uri-for-prefix()以获得绑定(bind)到元素的范围内命名空间的命名空间前缀和命名空间 URI。

for $element in $doc//*
return 
  for $prefix in fn:in-scope-prefixes($element)
  return string-join( (name($element), $prefix,fn:namespace-uri-for-prefix($prefix, $element) ), "|")

请注意,XML 命名空间 http://www.w3.org/XML/1998/namespace 将包含在前缀 xml 中。您可以使用谓词过滤器排除它:

for $element in $doc//*:plus[2]
return 
  for $prefix in fn:in-scope-prefixes($element)[not(. eq 'xml')]
  return string-join((name($element), $prefix,fn:namespace-uri-for-prefix($prefix, $element)), "|")

关于xml - 如何获取单个 XML 元素的所有 namespace 声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52939604/

相关文章:

xml - Xquery:开关函数中的情况表达式不起作用

xpath - 属性和元素上的 xquery 过滤器

xquery - xQuery 中的元素构造函数是什么?

java - 如何使软键盘不直接推到编辑文本,而是推到编辑文本下方的特定位置? (安卓)

java - 我可以从 xml 获取选定的标签并下载该值吗?

c# - 如何在 C# 中使用 XPath 检索最后一个节点?

xml - XPath:仅当所有子节点都具有特定值时才获取父节点的属性

用于选择 <strong> 标记后的文本的 xpath 语法

c++ - 使用 libxml 解析带有冒号的 xml

android - 如何在图形布局android studio中的Attributes下添加font Family属性