开发者

XPath Select node from current node value when the two attribute names are the same

开发者 https://www.devze.com 2022-12-21 04:13 出处:网络
Can anyone help me with this little issue I am having. The XML <MPN> <MTR MSN=\"AB123456\"/>

Can anyone help me with this little issue I am having.

The 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>

I would like to retrieve the DateActionRequiredBy from the JRA element, when the parser is sitting at the MTR Element, only one should be returned.

I have tried.

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

which returns {Dimension:[2]} NodeSet, this matches everything due to the @MSN attribute effectively matching itself not the parent.

../JOB/JMR[@MSN =开发者_如何学JAVA ./@MSN]/JRA/@DateActionRequiredBy

which returns {Dimension:[2]} NodeSet

I have found a solution but it will require a variable inside every xsl:attribute which doesn't seem right to me.

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

which returns 20090701120012 Attribute

This is what i am after, but there must be an easier way to achieve this other than a variable for every attribute.

Thanks in advance.


<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>

then you would need to use this XPath:

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

Note that this will work in XSLT only, since current() is an XSLT function.

You could ease the process by adding an XSL key:

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

and in XPath:

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

Explanation why your tries don't work as expected. Both

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

compare @MSN with itself - an operation that can never fail. This way you always get all possible nodes.

Within a predicate, the XPath context always is the node that you apply the predicate to. The current() function is there to provide you with the XSLT context.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号