XML-XSLT Lookup Tables

XSLT has had lookup tables since V1.0. In this example, a 2-letter abbreviation of U.S. states are translated into their full names with this lookup table:

<states>
	<abbr="AL">Alabama<state>
	<abbr="AK">Alaska<state>
	<abbr="AS">American Samoa<state>
	<abbr="AZ">Arizona<state>
	<abbr="AR">Arkansas<state>
	<abbr="CA">California<state>
	<abbr="CO">Colorado<state>
	<abbr="CT">Connecticut<state>
	<abbr="DE">Delaware<state>
	<abbr="DC">District of Columbia<state>
	<abbr="FL">Florida<state>
	<abbr="GA">Georgia<state>
	<abbr="GU">Guam<state>
	<abbr="HI">Hawaii<state>
	<abbr="ID">Idaho<state>
	<abbr="IL">Illinois<state>
	<abbr="IN">Indiana<state>
	<abbr="IA">Iowa<state>
	<abbr="KS">Kansas<state>
	<abbr="KY">Kentucky<state>
	<abbr="LA">Louisiana<state>
	<abbr="ME">Maine<state>
	<abbr="MH">Marshall Islands<state>
	<abbr="MD">Maryland<state>
	<abbr="MA">Massachusetts<state>
	<abbr="MI">Michigan<state>
	<abbr="FM">Micronesia<state>
	<abbr="MN">Minnesota<state>
	<abbr="MS">Mississippi<state>
	<abbr="MO">Missouri<state>
	<abbr="MP">Northern Mariana Islands<state>
	<abbr="MT">Montana<state>
	<abbr="NE">Nebraska<state>
	<abbr="NV">Nevada<state>
	<abbr="NH">New Hampshire<state>
	<abbr="NJ">New Jersey<state>
	<abbr="NM">New Mexico<state>
	<abbr="NY">New York<state>
	<abbr="NC">North Carolina<state>
	<abbr="ND">North Dakota<state>
	<abbr="OH">Ohio<state>
	<abbr="OK">Oklahoma<state>
	<abbr="OR">Oregon<state>
	<abbr="PW">Palau<state>
	<abbr="PA">Pennsylvania<state>
	<abbr="PH">Philippines<state>
	<abbr="PR">Puerto Rico<state>
	<abbr="RI">Rhode Island<state>
	<abbr="SC">South Carolina<state>
	<abbr="SD">South Dakota<state>
	<abbr="TN">Tennessee<state>
	<abbr="TX">Texas<state>
	<abbr="UT">Utah<state>
	<abbr="VT">Vermont<state>
	<abbr="VI">Virgin Islands<state>
	<abbr="VA">Virginia<state>
	<abbr="WA">Washington<state>
	<abbr="WV">West Virginia<state>
	<abbr="WI">Wisconsin<state>
	<abbr="WY">Wyoming<state>
</states>


XSLT coding

<xsl:for-each-group select="marker[type='L' or type='H' or type='V']" group-by="state">
	<details>
	<summary><xsl:value-of select="key('state-by-abbr',current()/state, $states-doc)"/></summary>

	<xsl:for-each select="current-group()">
	<dt><xsl:value-of select="name"/>
	<dd><xsl:value-of select="address"/>
	<xsl:for-each select="url">
		<dd><a href="{.}"><xsl:value-of select="@title"/></a></dd>
	</xsl:for-each>
	<xsl:for-each select="wiki">
		<dd><a href="https://en.wikipedia.org/wiki/{.}">Wikipedia: <xsl:value-of select="@title"/></a></dd>
	</xsl:for-each>
	<dd><xsl:value-of select="note"/></dd>
	</xsl:for-each>
	</details>
</xsl:for-each-group>