任何人都可以帮我解决这个小问题.
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>
Run Code Online (Sandbox Code Playgroud)
我想从JRA元素中检索DateActionRequiredBy,当解析器位于MTR元素时,只应返回一个.
我试过了.
../JOB/JMR[@MSN = @MSN]/JRA/@DateActionRequiredBy
Run Code Online (Sandbox Code Playgroud)
返回{Dimension:[2]} NodeSet,由于@MSN属性有效地匹配自身而不是父级,因此匹配所有内容.
../JOB/JMR[@MSN = ./@MSN]/JRA/@DateActionRequiredBy
Run Code Online (Sandbox Code Playgroud)
返回{Dimension:[2]} NodeSet
我找到了一个解决方案,但它需要在每个xsl:属性中都有一个变量,这对我来说似乎不对.
<xsl:variable name="storeMSN" select="@MSN"/>
../JOB/JMR[@MSN = $storeMSN]/JRA/@DateActionRequiredBy
Run Code Online (Sandbox Code Playgroud)
返回 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>
Run Code Online (Sandbox Code Playgroud)
那么你需要使用这个XPath:
../JOB/JMR[@MSN = current()/@MSN]/JRA/@DateActionRequiredBy
Run Code Online (Sandbox Code Playgroud)
请注意,这只适用于XSLT,因为它current()
是一个XSLT函数.
您可以通过添加XSL密钥来简化该过程:
<xsl:key name="kJMR" match="JMR" use="@MSN" />
Run Code Online (Sandbox Code Playgroud)
在XPath中:
key('kJMR', @MSN)/JRA/@DateActionRequiredBy
Run Code Online (Sandbox Code Playgroud)
解释为什么尝试不能按预期工作.都
../JOB/JMR[@MSN = @MSN]/JRA/@DateActionRequiredBy
../JOB/JMR[@MSN = ./@MSN]/JRA/@DateActionRequiredBy
@MSN
与自身比较- 一个永远不会失败的操作.这样,您始终可以获得所有可能的节点.
在谓词中,XPath上下文始终是您应用谓词的节点.该current()
函数用于为您提供XSLT上下文.
归档时间: |
|
查看次数: |
6038 次 |
最近记录: |