【问题标题】:Select parent nodes which have a subnode with specific attribute via XPath?通过 XPath 选择具有特定属性的子节点的父节点?
【发布时间】:2017-02-17 17:28:26
【问题描述】:

我需要节点AX_Namensnummer,其中子节点istBestandteilVon具有属性值urn:adv:oid:DEBBAL0600000Y09

这是我的 XML 中的一个小片段:

<enthaelt>
        <wfs:FeatureCollection gml:id="A75">
        <gml:featureMember>
            <AX_Namensnummer gml:id="DEBBAL0600000XUm">
                <gml:identifier codeSpace="http://www.adv-online.de/">urn:adv:oid:DEBBAL0600000XUm</gml:identifier>
                <lebenszeitintervall>
                    <AA_Lebenszeitintervall>
                        <beginnt>2012-01-11T07:03:49Z</beginnt>
                    </AA_Lebenszeitintervall>
                </lebenszeitintervall>
                <modellart>
                    <AA_Modellart>
                        <advStandardModell>DLKM</advStandardModell>
                    </AA_Modellart>
                </modellart>
                <anlass>000000</anlass>
                <laufendeNummerNachDIN1421>0001.00.00.00.00</laufendeNummerNachDIN1421>
                <eigentuemerart>3000</eigentuemerart>
                <istBestandteilVon xlink:href="urn:adv:oid:DEBBAL0600000Y09"/>
                <benennt xlink:href="urn:adv:oid:DEBBAL0600000Y09"/>
            </AX_Namensnummer>
        </gml:featureMember>
    </wfs:FeatureCollection>
</enthaelt>

这里是命名空间:

<AX_Bestandsdatenauszug
    xmlns="http://www.adv-online.de/namespaces/adv/gid/6.0"
    xmlns:adv="http://www.adv-online.de/namespaces/adv/gid/6.0"
    xmlns:gco="http://www.isotc211.org/2005/gco"
    xmlns:gmd="http://www.isotc211.org/2005/gmd"
    xmlns:gml="http://www.opengis.net/gml/3.2"
    xmlns:ows="http://www.opengis.net/ows"
    xmlns:wfs="http://www.adv-online.de/namespaces/adv/gid/wfs"
    xmlns:wfsext="http://www.adv-online.de/namespaces/adv/gid/wfsext"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ogc="http://www.adv-online.de/namespaces/adv/gid/ogc"
    xsi:schemaLocation="http://www.adv-online.de/namespaces/adv/gid/6.0 NAS-Operationen.xsd">

我的 XPath:

.//{http://www.adv-online.de/namespaces/adv/gid/6.0}AX_Namensnummer/{http://www.adv-online.de/namespaces/adv/gid/6.0}istBestandteilVon[@{http://www.w3.org/1999/xlink}href='urn:adv:oid:DEBBAL0600000Y09']

我得到了节点istBestandteilVon,但我需要AX_Namensnummer

我做错了什么?

【问题讨论】:

    标签: xml xpath xml-namespaces


    【解决方案1】:

    我做错了什么?

    • 未定义和使用命名空间前缀。
    • 不知道哪些元素在命名空间中,哪些不在。
    • 不了解默认命名空间如何影响子元素。
    • 定位一个@xlink:href 值,该值不存在于记录中 元素。
    • 将谓词放在子元素而不是父元素上。

    对于此 XML(已修复为格式良好的命名空间并已更新以反映更新问题中的默认命名空间),

    <?xml version="1.0" encoding="UTF-8"?>
    <AX_Namensnummer xmlns="http://www.adv-online.de/namespaces/adv/gid/6.0" 
                     xmlns:gml="http://www.adv-online.de/namespaces/adv/gid/6.0" 
                     xmlns:xlink="http://www.w3.org/1999/xlink"
                     gml:id="DEBBAL0600000XUm">   
        <gml:identifier codeSpace="http://www.adv-online.de/">urn:adv:oid:DEBBAL0600000XUm</gml:identifier>  
        <lebenszeitintervall> 
          <AA_Lebenszeitintervall> 
            <beginnt>2012-01-11T07:03:49Z</beginnt> 
          </AA_Lebenszeitintervall> 
        </lebenszeitintervall>  
        <modellart> 
          <AA_Modellart> 
            <advStandardModell>DLKM</advStandardModell> 
          </AA_Modellart> 
        </modellart>  
        <anlass>000000</anlass>  
        <laufendeNummerNachDIN1421>0001.00.00.00.00</laufendeNummerNachDIN1421>  
        <eigentuemerart>3000</eigentuemerart>  
        <istBestandteilVon xlink:href="urn:adv:oid:DEBBAL0600000XOX"/>  
        <benennt xlink:href="urn:adv:oid:DEBBAL0600000Y09"/> 
    </AX_Namensnummer> 
    

    对于这个命名空间声明,

    xlink="http://www.w3.org/1999/xlink"
    adv="http://www.adv-online.de/namespaces/adv/gid/6.0"
    

    这个 XPath,

    //adv:AX_Namensnummer[adv:istBestandteilVon/@xlink:href='urn:adv:oid:DEBBAL0600000XOX']
    

    将根据请求选择父 AX_Namensnummer 元素。

    另请参阅: How does XPath deal with XML namespaces?

    【讨论】:

    • 我添加了所有命名空间。每次我尝试使用它说的前缀:“前缀映射中找不到前缀”:(
    • 所以,一个默认命名空间。已调整答案以容纳 adv="http://www.adv-online.de/namespaces/adv/gid/6.0" 作为默认命名空间。
    • 强烈建议您查看命名空间在 XML 和 XPath 中的工作方式。例如,确保您了解How does XPath deal with XML namespaces
    • 现在我对命名空间有了更多了解,前缀...我知道我应该使用前缀,但为什么我不能使用孔命名空间?这个 xpath 应该可以工作:.//{http://www.adv-online.de/namespaces/adv/gid/6.0}AX_Namensnummer[{http://www.adv-online.de/namespaces/adv/gid/6.0}istBestandteilVon/@{http://www.w3.org/1999/xlink}href='urn:adv:oid:DEBBAL0600000Y09'],但他不工作。我得到了SyntaxError: invalid predicate
    • Braced URI Literals 需要 XPath 3.0。
    猜你喜欢
    • 2013-11-30
    • 2011-01-30
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多