2012-07-26 92 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

相關問題