2012-07-26 114 views
1

我有一些XML看起来是这样的:如何使用动态属性在XSLT中创建元素?

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

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

回答

3
<xsl:attribute name="field"><xsl:value-of select="Key"/></xsl:attribute> 
+0

完美的作品。辉煌。谢谢 – user1554759 2012-07-26 14:01:25

+5

是的。或者,''。 – LarsH 2012-07-26 14:18:17

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> 
+1

总是?如果是这样的话,我不认为语言设计者会花费在定义中包含“for-each”。我写了很多XSLT,有时'for-each'更有意义。它不那么强大,这意味着它更具可预测性,因此更易于追踪和调试。 – LarsH 2012-07-26 14:20:32

+2

同意。我应该让我的评论更少。我应该这样说:当模板匹配很明显时,它是可取的。 – 2012-07-26 14:29:24