2017-10-08 60 views
0

I次のXMLがありますXSLTの取得値が他の要素の値に基づいて

<data> 
     <name>att1</name> 
     <value>BLUE</value> 
    </data> 
    <data> 
     <name>id</name> 
     <value>5864828</value> 
    </data> 
    <data> 
     <name>att2</name> 
     <value>XL</value> 
    </data> 
    <data> 
     <name>status</name> 
     <value>In-Stock</value> 
    </data> 

を、私はそれを変換する必要があります。

<product> 
    <id>5864828</id> 
    <color>BLUE</color> 
    <size>XL</size> 
    <avail>In-Stock</avail> 
</product> 

私が発見した、次の質問: Concatenate XSLT element values based on another element value そのスレッドでは、属性の名前を変更するときに「xsl-if」を使用してソリューションを提供していますが、データの表示順序を変更する必要はありません。

ここで私の質問は、xsl-ifを使用する必要がなく、実際に属性の順序を変更できる方法ですか?

+1

"xsl-ifを使う必要がなく、実際に属性の順序を変更できる方法はありますか?"それは混乱しています。入力XMLと出力には、いずれの属性も含まれていません。入力にはルート要素がありません。 – mzjn

+0

@mzjn混乱して申し訳ありませんが、属性は製品属性(色、サイズなど)を参照しています。 – minus

答えて

0

順序を一致させたテンプレートを選択して(xsl-ifの場合)xsl-chooseの代わりに要素を作成することで、望ましい出力が得られます。

サンプルxmlの不足分を補うために任意の<root>要素を発明しました。一致するテンプレートを使用して移動するための方法ですが、必要な条件を得るために必要なXPathを表現するのは難しいことができます - XSLTについて

<?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"/> 

    <!-- always start out matching the document root --> 
    <xsl:template match="/"> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <!-- match the root element (not shown in your example) --> 
    <xsl:template match="root"> 
     <xsl:element name="product"> 
      <!-- apply templates in the desired order, specifically selecting matching 'data' elements --> 
      <xsl:apply-templates select="data[name/text() = 'id']" /> 
      <xsl:apply-templates select="data[name/text() = 'att1']" /> 
      <xsl:apply-templates select="data[name/text() = 'att2']" /> 
      <xsl:apply-templates select="data[name/text() = 'status']" /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="data"> 
     <!-- choose the desired output element based on the current data/name text --> 
     <xsl:choose> 
      <xsl:when test="./name[text() = 'id']"> 
       <xsl:element name="id"> 
        <xsl:value-of select="./value" /> 
       </xsl:element> 
      </xsl:when> 
      <xsl:when test="./name[text() = 'att1']"> 
       <xsl:element name="color"> 
        <xsl:value-of select="./value" /> 
       </xsl:element> 
      </xsl:when> 
      <xsl:when test="./name[text() = 'att2']"> 
       <xsl:element name="size"> 
        <xsl:value-of select="./value" /> 
       </xsl:element> 
      </xsl:when> 
      <xsl:when test="./name[text() = 'status']"> 
      <xsl:element name="avail"> 
        <xsl:value-of select="./value" /> 
       </xsl:element> 
      </xsl:when> 
      <xsl:otherwise /> 
     </xsl:choose> 
    </xsl:template> 

</xsl:stylesheet> 

最も一般的な誤解がxsl-foreachを試してみることです。

関連する問題