当前位置 : 主页 > 网页制作 > xml >

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

来源:互联网 收集:自由互联 发布时间:2021-06-13
任何人都可以帮我解决这个小问题. 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
任何人都可以帮我解决这个小问题.

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:属性中都有一个变量,这对我来说似乎不对.

<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密钥来简化该过程:

<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上下文.

网友评论