我有一些看起来像这样的XML:
<ExtensionObject>
<Value xmlns="">
<Key>key01</Key>
<StringValue>somewords</StringValue>
</Value>
<Value xmlns="">
<Key>key01</Key>
<NumberValue>12345</NumberValue>
</Value>
...........hundreds more Values..............
</ExtensionObject>
我比较乐观地写这样的XSLT:
<xsl:template match="/ExtensionObject">
<VResult>
<xsl:for-each select="Value">
<xsl:variable name="fld">
<Value><xsl:value-of select="Key"/></Value>
</xsl:variable>
<Result field="$fld">
<Value>
<xsl:choose>
<xsl:when test="NumberValue">
<xsl:value-of select="NumberValue"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="StringValue"/>
</xsl:otherwise>
</xsl:choose>
</Value>
</Result>
</xsl:for-each>
</VResult>
</xsl:template>
预计会得到这个:
<VResult>
<Result field="key01"><Value>somewords</Value></Result>
<Result field="key02"><Value>12345</Value></Result>
...........hundreds more Values..............
</VResult>
相反,我得到了:
<VResult>
<Result field="$fld"><Value>somewords</Value></Result>
<Result field="$fld"><Value>12345</Value></Result>
...........hundreds more Values..............
</VResult>
有谁知道如何使用键值插入字段名称?
答案 0 :(得分:3)
<xsl:attribute name="field"><xsl:value-of select="Key"/></xsl:attribute>
答案 1 :(得分:1)
使用模板总是更好,而不是使用for-each:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<VResults>
<xsl:apply-templates select='*' />
</VResults>
</xsl:template>
<xsl:template match="Value">
<Result>
<xsl:attribute name='field'><xsl:value-of select='Key' /></xsl:attribute>
<xsl:apply-templates />
</Result>
</xsl:template>
<xsl:template match="NumberValue|StringValue">
<Value><xsl:value-of select='.' /></Value>
</xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>