Search code examples
xmlxsltxpathsubtreexslkey

Can XPath do a foreign key lookup across two subtrees of an XML?


Say I have the following XML...

<root>
  <base>
    <tent key="1" color="red"/>
    <tent key="2" color="yellow"/>
    <tent key="3" color="blue"/>
  </base>
  <bucket>
    <tent key="1"/>
    <tent key="3"/>
  </bucket>
</root>

...what would the XPath be that returns that the "bucket" contains "red" and "blue"?


Solution

  • If you're using XSLT, I'd recommend setting up a key:

    <xsl:key name="tents" match="base/tent" use="@key" />
    

    You can then get the <tent> within <base> with a particular key using

    key('tents', $id)
    

    Then you can do

    key('tents', /root/bucket/tent/@key)/@color
    

    or, if $bucket is a particular <bucket> element,

    key('tents', $bucket/tent/@key)/@color