gpt4 book ai didi

xml - XPath 当两个属性名相同时从当前节点值中选择节点

转载 作者:数据小太阳 更新时间:2023-10-29 02:02:39 26 4
gpt4 key购买 nike

谁能帮我解决我遇到的这个小问题。

XML

<MPN>
<MTR MSN="AB123456"/>
<MTR MSN="AB654321"/>
<MTR MSN="AB654322"/>
<MTR MSN="AB654323”/>
<MTR MSN="AB654324"/>
<JOB JobId="136">
<JMR MSN="AB123456">
<JRA DateActionRequiredBy="20090701120012" />
</JMR>
<JMR MSN="AB654321">
<JRA DateActionRequiredBy="20090701100010" />
</JMR>
</JOB>
</MPN>

我想从 JRA 元素中检索 DateActionRequiredBy,当解析器位于 MTR 元素时,应该只返回一个。

我试过了。

../JOB/JMR[@MSN = @MSN]/JRA/@DateActionRequiredBy

它返回 {Dimension:[2]} NodeSet,由于 @MSN 属性有效地匹配自身而不是父级,因此它匹配所有内容。

../JOB/JMR[@MSN = ./@MSN]/JRA/@DateActionRequiredBy

返回 {Dimension:[2]} NodeSet

我找到了一个解决方案,但它需要在每个 xsl:attribute 中有一个变量,这对我来说似乎不合适。

<xsl:variable name="storeMSN" select="@MSN"/>
../JOB/JMR[@MSN = $storeMSN]/JRA/@DateActionRequiredBy

返回 20090701120012 属性

这就是我所追求的,但除了每个属性的变量之外,必须有一种更简单的方法来实现这一点。

提前致谢。

最佳答案

<MPN>
<MTR MSN="AB123456"/>
<MTR MSN="AB654321"/><!-- current node (i.e. context node) -->
<MTR MSN="AB654322"/>
<MTR MSN="AB654323”/>
<MTR MSN="AB654324"/>
<JOB JobId="136">
<JMR MSN="AB123456">
<JRA DateActionRequiredBy="20090701120012" />
</JMR>
<JMR MSN="AB654321">
<JRA DateActionRequiredBy="20090701100010" /><!-- desired node -->
</JMR>
</JOB>
</MPN>

那么您需要使用这个 XPath:

../JOB/JMR[@MSN = current()/@MSN]/JRA/@DateActionRequiredBy

请注意,这仅适用于 XSLT,因为 current() 是一个 XSLT 函数。

您可以通过添加 XSL key 来简化该过程:

<xsl:key name="kJMR" match="JMR" use="@MSN" />

在 XPath 中:

key('kJMR', @MSN)/JRA/@DateActionRequiredBy

解释为什么您的尝试没有按预期工作。两者

  • ../JOB/JMR[@MSN = @MSN]/JRA/@DateActionRequiredBy
  • ../JOB/JMR[@MSN = ./@MSN]/JRA/@DateActionRequiredBy

比较 @MSN 和它自己——一个永远不会失败的操作。这样你总能得到所有可能的节点。

在谓词中,XPath 上下文始终是应用谓词的节点。 current() 函数用于为您提供 XSLT 上下文。

关于xml - XPath 当两个属性名相同时从当前节点值中选择节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2319187/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com