2010-10-15 94 views
5

我有一個自定義XML,需要使用XSL轉換爲另一種XML格式。使用XSLT轉換XML

輸入:

<Feed> 
    <repository> 
    <item-descriptor name="product"> 
    <property name="id">123</property> 
    <property name="display">asdf</property> 
    <property name="attr1">attr1</property> 
    <property name="attr2">attr2</property> 
    </item-descriptor> 
    </repository> 
</Feed> 

輸出:

<Feed> 
    <Products> 
    <product> 
    <id>123</id> 
    <display>asdf</display> 
    <attr1>attr1</attr> 
    <attr2>attr2</attr2> 
    </product> 
    </Products> 
</Feed> 

以下XSL是用於獲取所需的輸出。

XSL:

<xsl:template match="/"> 
    <xsl:apply-templates select="Feed"/> 
    </xsl:template> 
    <xsl:template match="Feed"> 
    <Feed> 
    <Products> 
    <xsl:apply-templates select="repository/item-descriptor[@name='product']"/> 
    </Products> 
    </Feed> 
    </xsl:template> 
    <xsl:template match="repository/item-descriptor[@name='product']"> 
    <product> 
    <xsl:apply-templates select="property"/> 
    </product> 
    </xsl:template> 
    <xsl:template match="property"> 
    <xsl:if [email protected]='id'> 
    <id><xsl:value-of select='.'></id> 
    </xsl:if> <xsl:if [email protected]='display'> 
    <display><xls:value-of select='.'></display> 
    <xsl:if [email protected]='attr1'> 
    <attr1><xsl:value-of select='.'></attr1> 
</xsl:if> 
    <xsl:if [email protected]='attr2'> 
<attr2><xls:value-of select='.'></attr2> 
</xsl:template> 

現在我需要生成以下,請幫我在修改上述XSL得到以下的輸出:

<Feed> 
    <Products> 
    <product> 
    <id>123</id> 
    <display>asdf</display> 
    <attributes> 
    <aatr1>attr1</attr1> 
    <attr2>attr2</attr2> 
    </attributes> 
    </product> 
    </Products> 
</Feed> 
+0

問得好,+1。 Seemy回答完整的解決方案。 – 2010-10-15 19:12:11

+0

@Shaji時間來關閉這個答案... – 2016-05-20 22:04:39

回答

3

這種轉變:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/*"> 
    <Feed> 
    <xsl:apply-templates/> 
    </Feed> 
</xsl:template> 

<xsl:template match="*[item-descriptor/@name='product']"> 
    <Products> 
    <xsl:apply-templates/> 
    </Products> 
</xsl:template> 

<xsl:template match="item-descriptor[@name='product']"> 
    <product> 
     <xsl:apply-templates select="*/@name[not(starts-with(.,'attr'))]"/> 
     <attributes> 
     <xsl:apply-templates select="*/@name[starts-with(.,'attr')]"/> 
     </attributes> 
    </product> 
</xsl:template> 

<xsl:template match="@name"> 
    <xsl:element name="{.}"> 
    <xsl:apply-templates select="../node()"/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

當應用於提供的XML文件

<Feed> 
    <repository> 
     <item-descriptor name="product"> 
      <property name="id">123</property> 
      <property name="display">asdf</property> 
      <property name="attr1">attr1</property> 
      <property name="attr2">attr2</property> 
     </item-descriptor> 
    </repository> 
</Feed> 

產生想要的,正確的結果

<Feed> 
    <Products> 
     <product> 
      <id>123</id> 
      <display>asdf</display> 
      <attributes> 
       <attr1>attr1</attr1> 
       <attr2>attr2</attr2> 
      </attributes> 
     </product> 
    </Products> 
</Feed> 
+2

+1好答案! – 2010-10-15 19:39:57