我正在尝试在这样的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" >
Run Code Online (Sandbox Code Playgroud)
我能够使用Firepath找到节点,如下所示:
/*[local-name()='TrustedDataObject']
Run Code Online (Sandbox Code Playgroud)
但是如果我想在节点中选择一个属性,比如gml属性,我不知道该怎么做.我尝试过几种不同的方式:
/*[local-name()='TrustedDataObject']/@gml
Run Code Online (Sandbox Code Playgroud)
要么
/*[local-name()='TrustedDataObject'][gml]
Run Code Online (Sandbox Code Playgroud)
他们不匹配任何东西.
有人有什么建议吗?我知道这不是完整的代码,我现在无法访问整个文档,所以我道歉.
编辑 - 好的,我不确定是否应该开始另一个问题或只是编辑我的原文.我理解在尝试访问命名空间属性时存在一些限制,但我真正想要做的是在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, jsmith@walmart.com</ism:NoticeText>
</ism:Notice>
</tdf:TrustedDataObject>
<document>
Run Code Online (Sandbox Code Playgroud)
再次,我认为能够遍历到NoticeText节点,使用local-name()应该工作.像这样的东西?
//*[local-name()='NoticeText']/@ownerProducer
Run Code Online (Sandbox Code Playgroud)
再次感谢您的帮助.也许你告诉我所有这些属性都无法通过xpath访问...
通常,xpath处理器允许您注册名称空间,因此xpath将(使用相同的前缀注册名称空间)
//ism:NoticeText/@ism:ownerProducer
Run Code Online (Sandbox Code Playgroud)
例如,在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>
Run Code Online (Sandbox Code Playgroud)
根据这个答案,您在使用FirePath时无法注册名称空间,因此解决方法是仅查看本地名称.请注意,如果其他名称空间使用相同的本地名称,这可能会导致问题 - 当您执行此操作时,您将破坏名称空间的整个点,因此请在生产代码中使用更好的工具.
因此,要从本地名称为'NoticeText'的所有元素中选择本地名称为'ownerProducer'的所有属性,而不考虑命名空间,xpath将是
//*[local-name()='NoticeText']/@*[local-name()='ownerProducer']
Run Code Online (Sandbox Code Playgroud)
它被打破了
// 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'
Run Code Online (Sandbox Code Playgroud)