In 
a previous post, I've described how you can use local variables and XPath expressions to link elements in the input XML document. An even better (and probably faster) alternative is to use the XSL keys. For example, you might want to link the 
target element with the 
source element in an XML document based on the 
ref attribute of the source and the 
id/@num attribute of the 
target:
<data>
  <source id="abc" ref="123" />
 
  <target>
     <text>Message</text>
     <id num="123" />
  </target>
</data>
You can define a key that will select the target element or another one that will select the text child of the target element (in which case you have to be a bit more creative in the 
use part of 
xsl:key definition):
<xsl:key name="target" match="target" use="id/@num" />
<xsl:key name="ttext" match="target/text" use="../id/@num" />
Assuming you want to display the text child of the target node, you could use either key in your transformation. If you use the 
target key, it returns the 
target node, so you have to continue with the XPath expression to get its 
text child; using the 
ttext key gives you the 
text node immediately:
<xsl:template match="source">
  <xsl:variable name="target" select="@target" />
  Source <xsl:value-of select="@id" /> 
    target <xsl:value-of select="key('target',@target)/text" />
    ttext <xsl:value-of select="key('ttext',@target)" />
</xsl:template>
 
No comments:
Post a Comment