I have some xml that I want to process using xslt. A good amount of the data comes through in key value pairs (see below). I am struggling with how to extract the value base on the key into a variable. I would like to be able to do something like this:
<xsl:variable name="foo" select="/root/entry[key = 'foo']/value"/>
but that doesn't seem to work. Here is sample xml.
<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
<entry>
<key>
foo
</key>
<value>
bar
</value>
</entry>
</root>
What would the correct xpath be for this?
The following transformation shows two ways to achieve this -- with and without the use of <xsl:key>
and the key()
function:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:key name="kValueByKey"
match="value" use="normalize-space(../key)"/>
<xsl:template match="/">
1. By key: <xsl:text/>
<xsl:copy-of select="key('kValueByKey', 'foo')"/>
2. Not using key: <xsl:text/>
<xsl:copy-of select="/*/*[normalize-space(key)='foo']/value"/>
</xsl:template>
</xsl:stylesheet>
Do note the use of the normalize-space()
function to strip any leading or trailing whitespace characters from the value of <key>
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With