local-name 如何在 xml 节点中查找属性?

2024-02-01

我正在尝试选择 XML 节点中的一个属性,如下所示:

<tdf:TrustedDataObject xmlns="urn:com:bank:baml:tdf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" >

我可以使用 Firepath 找到节点,如下所示:

/*[local-name()='TrustedDataObject']

但如果我想选择节点内的某个属性(例如 gml 属性),我不知道如何执行此操作。我尝试了几种不同的方法,例如:

/*[local-name()='TrustedDataObject']/@gml

or

/*[local-name()='TrustedDataObject'][gml]

而且它们不匹配任何东西。

有人有一些建议吗?我知道这不是完整的代码,我现在无法访问整个文档,所以我很抱歉。

EDIT- 好吧,我不确定是否应该开始另一个问题或只是编辑我的原始问题。我知道尝试访问命名空间属性时存在限制,但实际上我想做的是在NoticeText 中的属性上创建一个内容节点,例如ownerProducer 和pocType。

<document>
   <tdf:TrustedDataObject xmlns="urn:com:bank:baml:tdf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" >
      <ism:Notice ism:classification="X" ism:ownerProducer="ABC" ism:noticeType="POC" ism:externalNotice="true">
        <ism:NoticeText ism:classification="X" ism:ownerProducer="ABC" ism:pocType="JJJ-710">John Smith, Walmart, [email protected] /cdn-cgi/l/email-protection</ism:NoticeText>
      </ism:Notice>
   </tdf:TrustedDataObject>
<document>

同样,我认为能够使用 local-name() 向下遍历到NoticeText节点应该可行。像这样的东西吗?

//*[local-name()='NoticeText']/@ownerProducer  

再次感谢您的帮助。也许您告诉我所有这些属性都无法通过 xpath 访问......


一般来说,xpath 处理器允许您注册名称空间,因此 xpath 将是(使用相同的前缀注册名称空间)

//ism:NoticeText/@ism:ownerProducer

例如,在 XSLT 中,您可以使用命名空间声明在模板的 XML 中注册命名空间,然后在 xpath 表达式中使用前缀

<xsl:stylesheet version="2.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ism="urn:us:gov:ic:ism">
<xsl:template match="/">
<result>
<xsl:value-of select="//ism:NoticeText/@ism:ownerProducer">
</result>
</xsl:template>
</xsl:stylesheet>

根据这个答案 https://stackoverflow.com/a/5286781/1527使用 FirePath 时无法注册名称空间,因此解决方法是仅查看本地名称。请注意,如果其他命名空间使用相同的本地名称,这可能会导致问题 - 当您这样做时,您就破坏了命名空间的全部意义,因此在生产代码中使用更好的工具。

因此,要从本地名称为“NoticeText”的所有元素中选择本地名称为“ownerProducer”的所有属性(无论命名空间如何),xpath 将为

//*[local-name()='NoticeText']/@*[local-name()='ownerProducer'] 

分解为

//                             a descendent of the current context
*                              any element
[local-name()='NoticeText']    whose local name is 'NoticeText'
/                              a child of the current context
@*                             any attribute
[local-name()='ownerProducer'] whole local name is 'ownerProducer'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

local-name 如何在 xml 节点中查找属性? 的相关文章

随机推荐