【问题标题】:Cannot query using XPath when data element has attribute **xmlns="..."**当数据元素具有属性 **xmlns="..."** 时无法使用 XPath 进行查询
【发布时间】:2013-05-03 18:08:44
【问题描述】:

当属性 xmlns="..." 并且它是父元素时,我很难查询数据元素值的值。 以下示例是 SOAP 响应的一部分,我想通过使用 XPATH /PartyInq_v2Response/PartyInq_v2Rs_Type/*[local-name()="person"]/firstName 获取它的名字和姓氏的值' 。但它什么也没返回。如果我全部删除它可以返回值 xmlns="..." 来自查询前的 xml。有人知道如何直接从示例中查询名字吗?

<PartyInq_v2Response xmlns="urn:Somewhere.Int" xmlns:q2="http://SomewhereOps.v20120719" xmlns:q10="http://SomewhereTypes.v20120719.GenericTypes">
    <PartyInq_v2Rs_Type>
        <q2:person>
            <firstName xmlns="http://SomewhereTypes.v20120719.Types">somebody</firstName>
            <lastName xmlns="http://SomewhereTypes.v20120719.Types">nobody</lastName>           
        </q2:person>
    </PartyInq_v2Rs_Type>
</PartyInq_v2Response>

谢谢

【问题讨论】:

    标签: xml xslt xpath xml-namespaces


    【解决方案1】:

    不清楚您使用的是什么 xslt 处理器。但是你必须让 xlst 知道所有使用的命名空间。

    下面的 xlst 就可以了:

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:s="urn:Somewhere.Int" 
                xmlns:q2="http://SomewhereOps.v20120719"
                xmlns:q10="http://SomewhereTypes.v20120719.GenericTypes"
                xmlns:t="http://SomewhereTypes.v20120719.Types">
        <xsl:output method="xml" indent="yes"/>
    
        <xsl:template match="/" >
            <xsl:value-of select="/s:PartyInq_v2Response/s:PartyInq_v2Rs_Type/q2:person/t:firstName"/>
        </xsl:template>
    </xsl:stylesheet>
    

    如果命名空间 url 未知,您可以使用 local-name()。

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                 xmlns:s="urn:Somewhere.Int" >
        <xsl:output method="xml" indent="yes"/>
    
        <xsl:template match="/" >
            <xsl:value-of select="/s:PartyInq_v2Response/*[local-name() = 'PartyInq_v2Rs_Type']/*[local-name() = 'person']/*[local-name()='firstName']"/>
        </xsl:template>
    </xsl:stylesheet>
    

    【讨论】:

    • 感谢您的帮助。我正在使用 XMLSpy 进行测试。有没有办法忽略命名空间而不是在 xlst 中定义它们?因为我们正在使用一个工具来生成 SOAP 模式,该模式将用于创建 SOAP 响应消息。每次,当我们重新创建这些模式时,内部命名空间(例如 q10、q2)可能在每次重新生成模式期间都不同,即q10 更改为 q20。这将使得在我的 xslt 中定义(硬代码)命名空间变得非常困难。
    • 只是前缀变了还是url也变了?如果仅更改前缀,则无关紧要。如果 url 改变了,你可以像以前一样使用 local-name。 (见更新。)
    • 谢谢 hr_117 :) 但是,只要 XML 中的 xmlns=blabla 作为属性,Local-name() 就不起作用,至少在 XMLSPy 中是这样。这就是我在这里发布问题的原因。如果我删除了这些属性,那么是否有前缀都没有关系,它肯定会起作用。所以也许我应该使用你给我看的第一个。
    猜你喜欢
    • 2015-09-10
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    相关资源
    最近更新 更多