2017-08-10 55 views
0

我一直在嘗試使用XSLT轉換XML文件的結構,但我卡住了。使用xslt轉換XML子元素結構

輸入:

<products> 
<product> 
<name>name</name> 
<prodoptions> 
<prodoption sku="foo" description="description"/> 
<prodoption sku="bar" description="otherdescription"/> 
</prodoptions> 
</product> 
</products> 

所需的輸出:

<products> 
<product> 
<name>name</name> 
<sku>foo</sku> 
<description>description</description> 
</product> 
<product> 
<name>name</name> 
<sku>bar</sku> 
<description>otherdescription</description> 
</product> 
</products> 

到目前爲止,我已經能夠使用XSLT選項的屬性轉移到單獨的子元素,並重新命名一對夫婦重複元素的但我堅持爲選項創建第二個產品元素。什麼xlst變換將產生輸出?

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:template match="@* | node()"> 
<xsl:copy> 
<xsl:apply-templates select="@* | node()"/> 
</xsl:copy> 
</xsl:template> 
<xsl:template match="prodoption/@*"> 
<xsl:element name="{name()}"> 
<xsl:value-of select="."/> 
</xsl:element> 
</xsl:template> 
<xsl:template match="prodoption/code"> 
<sku> 
<xsl:apply-templates select="@* | node()"/> 
</sku> 
</xsl:template> 
<xsl:template match="prodoption/@code"> 
<xsl:element name="sku"> 
<xsl:value-of select="."/> 
</xsl:element> 
</xsl:template> 
<xsl:template match="prodoption/@description"> 
<xsl:element name="name2"> 
<xsl:value-of select="."/> 
</xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

感謝

+0

爲什麼不發佈您的嘗試,以便我們可以修復它,而不必從頭開始爲您編寫代碼。 –

+0

對此感到抱歉 –

+0

如果他們匹配會很好。在給定的XML中我看不到'prodoption'。 –

回答

0

我建議你改變你的做法是這樣的:

XSLT 1.0

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

<xsl:template match="/products"> 
    <xsl:copy> 
     <xsl:for-each select="product/options/option"> 
      <product> 
       <xsl:copy-of select="../../name"/> 
       <xsl:for-each select="@*"> 
        <xsl:element name="{name()}"> 
         <xsl:value-of select="."/> 
        </xsl:element> 
       </xsl:for-each> 
      </product> 
     </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

注意,這將會爲每個選項的產品 - 和沒有任何選項的產品將不會被列出。

+0

感謝堆積了第一道關卡。我現在的問題是有重複的元素。我將如何修改您的XSLT以重命名這些元素?描述和代碼都存在於產品和產品中,所以當我運行你的xslt時,我同時得到了兩者。 –

+0

恐怕我不明白你的描述。我建議你發佈一個新的問題,並顯示一個產生重複的輸入例子,以及預期的輸出。 –