【问题标题】:Path definition with namespace带有命名空间的路径定义
【发布时间】:2014-07-15 15:44:30
【问题描述】:

我在使用此文档的 xPath 时遇到问题。 当元素 C21201 的部件号为 1111111 时,我想获取元素 C50603。 如果我删除命名空间,它会起作用。

这是我目前所拥有的,但没有命名空间。

   /*[local-name()='Root']
   /*[local-name()='InputMessagePart_1']
   /*[local-name()='EFACT_D97A_ORDERS']
   /*[local-name()='LINLoop1'][C212/C21201='111111']
   /*[local-name()='RFFLoop3']
   /*[local-name()='RFF_6']
   /*[local-name()='C506_6']
   /*[local-name()='C50603']

ns3 是 :='http://schemas.microsoft.com/BizTalk/EDI/EDIFACT/2006']

    <ns3:LINLoop1>
    <ns3:LIN>
        <LIN01>2</LIN01>
        <ns3:C212>
            <C21201>22222222</C21201>
            <C21202>VP</C21202>
            <C21204>91</C21204>
        </ns3:C212>
    </ns3:LIN>
    <ns3:QTY_3>
        <ns3:C186_3>
            <C18601>21</C18601>
            <C18602>1</C18602>
            <C18603>PCE</C18603>
        </ns3:C186_3>
    </ns3:QTY_3>
    <ns3:PRILoop1>
        <ns3:PRI>
            <ns3:C509>
                <C50901>AAA</C50901>
                <C50902>xxxxx</C50902>
                <C50903>CT</C50903>
                <C50905>1</C50905>
                <C50906>PCE</C50906>
            </ns3:C509>
        </ns3:PRI>
    </ns3:PRILoop1>
    <ns3:RFFLoop3>
        <ns3:RFF_6>
            <ns3:C506_6>
                <C50601>LI</C50601>
                <C50603>00002</C50603>
            </ns3:C506_6>
        </ns3:RFF_6>
    </ns3:RFFLoop3>
    <ns3:SCCLoop2>
        <ns3:SCC_2>
            <SCC01>1</SCC01>
        </ns3:SCC_2>
        <ns3:QTYLoop4>
            <ns3:QTY_7>
                <ns3:C186_7>
                    <C18601>21</C18601>
                    <C18602>1</C18602>
                    <C18603>PCE</C18603>
                </ns3:C186_7>
            </ns3:QTY_7>
            <ns3:DTM_25>
                <ns3:C507_25>
                    <C50701>2</C50701>
                    <C50702>xxxx</C50702>
                    <C50703>102</C50703>
                </ns3:C507_25>
            </ns3:DTM_25>
        </ns3:QTYLoop4>
    </ns3:SCCLoop2>
</ns3:LINLoop1>

【问题讨论】:

  • 是否有默认命名空间声明(xmlns="..."ns3:LINLoop1 的任何祖先上)?
  • 为什么要向我们展示不完整的 XML?您是否有兴趣获得不完整的 XPath 作为响应?

标签: xml xslt xpath biztalk


【解决方案1】:

乍一看,问题似乎出在这个谓词上

[C212/C21201='111111']

C212 元素有一个ns3 前缀,因此您需要考虑它的命名空间,它也是ns3:LIN 内的LINLoop1 的另一个层次

[*[local-name() = 'LIN']/*[local-name() = 'C212']/C21201='111111']

(如果 C21201 元素不在命名空间中,这将起作用。我无法从您发布的部分 XML 中判断是否是这种情况 - 如果在树的更高位置有 xmlns="..."那么您也需要在该路径步骤上使用相同的 local-name() 技巧。)

【讨论】:

  • 感谢您的回复。有
  • EPIC..... 它就像一种享受。整天都在忙……它甚至可以在 BizTalk 上运行。
【解决方案2】:

如果我删除命名空间,它会起作用。

There's your real answer,就在那里。命名空间会产生很多问题,但没有一个可以解决。

这是我目前所拥有的,但没有命名空间。

 /*[local-name()='LINLoop1'][C212/C21201='111111']

这不可能,因为您缺少 LINLoop1 和 C212 之间的 LIN 元素。 /*[local-name()='LINLoop1'] 的条件必须看起来像这样

[./*[local-name()='LIN']/*[local-name()='C212']/*[local-name()='C21201' and text()='111111']]

请注意,之所以需要所有这些 local-name() 恶作剧,只是因为名称空间妨碍了。 (无论如何,讨厌的值是它们的全部好处。)实际上,删除命名空间通常是最好的第一步。

【讨论】:

  • [*[local-name() = 'LIN']/*[local-name() = 'C212']/C21201='111111']
  • 这就是你降级答案的原因吗?
  • 这意味着您在 XML 元素层次结构中没有更高的默认命名空间。从您引用的片段中无法分辨,因此 local-name='C21201'] 是解决问题的“不拘一格”的方法。再一次,您删除的名称空间越多,答案就越简单。 :-)
  • C212 等元素没有嵌套在 LIN 元素中,因此您的 XPath 将无法工作。
  • 请再看看。
猜你喜欢
  • 1970-01-01
  • 2017-04-29
  • 2011-10-10
  • 1970-01-01
  • 2015-08-03
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多