2009-11-03 77 views
2

我需要創建一個XSLT,它將源xml中的屬性轉換爲目標xml中的新元素,其元素名稱分配了屬性中的「Name」值源xml。將屬性轉換爲XSLT 1.0中具有匹配名稱的元素

如:

來源:

<ProductType>Fridge</ProductType> 
    <Features> 
     <Feature Name="ValveID">somename</Feature> 
     <Feature Name="KeyIdentifier">someID</Feature> 

結果:

<Fridge> 
    <Feature>somename</Feature> 
    <Feature>someID</Feature> 

預期結果:

<Fridge> 
     <ValueID>somename</ValueID> 
     <KeyIdentifier>someID</KeyIdentifier> 

我的XSLT是這樣的現在:

1 <Fridge> 
2  <xsl:for-each select="$var6_ProductData/Features/Feature"> 
3   <xsl:variable name="var8_Feature" select="."/> 
4   <xsl:element name="{name()}"> 
5     <xsl:value-of select="string($var8_Feature)"/> 
6   </xsl:element> 
7  </xsl:for-each> 
8 </Fridge> 

我需要改變第4行,但不知道如何。有任何想法嗎??


d

回答

2

我會嘗試

<xsl:element name="{@Name}"> 

name()給你的XML元素的 「功能」(由xsl:for-each選擇)的名稱,當前節點的Name=的不是內容屬性。

+0

是的,這也可以。 – Dipesh 2009-11-03 02:01:18

0

想通了:

1 <Fridge> 
2  <xsl:for-each select="$var6_ProductData/Features/Feature"> 
3   <xsl:variable name="var8_Feature" select="."/> 
3   <xsl:variable name="var9_Feature" select="@Name"/> 
4   <xsl:element name="{$var9_Feature}"> 
5     <xsl:value-of select="string($var8_Feature)"/> 
6   </xsl:element> 
7  </xsl:for-each> 
8 </Fridge> 
+0

Dipesh,我會與Tomalak的實現一起使用,因爲它是通用的,併爲增強提供更多的靈活性 – 2009-12-31 03:50:59

4

通用的解決方案(和更地道,太):

<xsl:template match="ProductType"> 
    <xsl:element name="{text()}"> 
    <xsl:apply-templates select="Features/Feature" /> 
    </xsl:elemment> 
</xsl:template> 

<xsl:template match="Features/Feature"> 
    <xsl:element name="{@Name}"> 
    <xsl:value-of select="text()" /> 
    </xsl:elemment> 
</xsl:template> 

<ProductType>元素被轉換爲與動態命名的新元素,這同樣適用於<Feature>元件。

相關問題