2017-08-10 16 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を使用して、重複要素のカップルの名前を変更することができましたしかし、オプションの2番目の製品要素を作成しています。どのような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を以前にそれらの要素の名前を変更するためにどのように変更するのですか?説明とコードは、両方の製品とprodoptionsに存在するので、私はあなたのxsltを実行すると私は両方を取得します。 –

+0

私はあなたの記述を理解していないのは怖いです。新しい質問を投稿し、重複を生成する入力の例と、期待される出力を表示することをお勧めします。 –

関連する問題