如何使用动态属性在XSLT中创建元素?

时间:2012-07-26 13:45:50

标签: xslt xpath

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

有谁知道如何使用键值插入字段名称?

2 个答案:

答案 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>