Если вы просто хотите сделать код более читабельным, я бы предложил что-то простое, например:
<!-- expected columns -->
<xsl:variable name="NAME" value="1" />
<xsl:variable name="LOCATION" value="2" />
<!-- ... -->
<people>
<xsl:for-each select="fm:FMPXMLRESULT/fm:RESULTSET/fm:ROW">
<person>
<name>
<xsl:value-of select="fm:COL[$NAME]/fm:DATA"/>
</name>
<location>
<xsl:value-of select="fm:COL[$LOCATION]/fm:DATA"/>
</location>
</person>
</xsl:for-each>
</people>
Кстати, с <xsl:value-of />
вы можете опустить fm:DATA
, т.е. использовать:
<xsl:value-of select="fm:COL[$LOCATION] />
Будет возвращен тот же результат.
Если вам нужно что-то более сложное, пожалуйста, объясните.
Обновление:
Ссылаться на столбцы по именам столбцов сложнее, но возможно с чем-то вроде этого:
<!-- Define a key to get a field and all fields that precede it by the field name -->
<xsl:key name="N" match="/fm:FMPXMLRESULT/fm:METADATA/fm:FIELD" use="@NAME" />
<xsl:key name="N" match="/fm:FMPXMLRESULT/fm:METADATA/fm:FIELD"
use="following-sibling::fm:FIELD/@NAME" />
<!-- Then *count* them it in the code like that -->
<people>
<xsl:for-each select="fm:FMPXMLRESULT/fm:RESULTSET/fm:ROW">
<person>
<name>
<xsl:value-of select="fm:COL[count(key('N', 'name'))]" />
</name>
<location>
<xsl:value-of select="fm:COL[count(key('N', 'location'))]" />
</location>
</person>
</xsl:for-each>
</people>
Не очень элегантно, но работает.