1

我有一些看起来像这样的 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>

有谁知道如何插入带有键值的字段名称?

4

2 回答 2

3
<xsl:attribute name="field"><xsl:value-of select="Key"/></xsl:attribute>
于 2012-07-26T13:49:09.193 回答
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>
于 2012-07-26T13:57:26.710 回答