代码之家  ›  专栏  ›  技术社区  ›  ivanacorovic

如何获取单个xml元素的所有命名空间声明

  •  7
  • ivanacorovic  · 技术社区  · 6 年前

    如何使用xpath查询(甚至xquery)获取单个元素的nampespace前缀声明?我想看看他们是否在一个以上的地方被定义。

    例如,对于第一个元素,它将是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>
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Mads Hansen    6 年前

    你可以使用函数 in-scope-prefixes() namespace-uri-for-prefix() 以获取绑定到元素的作用域内命名空间的命名空间前缀和命名空间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)), "|")