2016-08-11 15 views
0

私は複数の属性を持つXMLを持っています。要素が目的の場所に移動するような条件チェックを実行したい。私は、それぞれの出力を達成するために使用できる用語またはタグを認識していません。XSLTで複合条件チェックを実行する方法

XML:

<Collection> 

<Allparts> 

    <part> 
     <number>001</number> 
     <material>Platinum</material> 
     <price>High</price> 
    </part> 

    <part> 
     <number>002</number> 
     <material>Gold</material> 
     <price>Medium</price> 
    </part> 

    <part> 
     <number>003</number> 
     <material>Silver</material> 
     <price>Low</price> 
    </part> 


</Allparts> 

<Allboms> 

    <bom> 
     <Part-number>001</Part-number> 
    </bom> 

    <bom> 
     <Part-number>002</Part-number> 
    </bom> 

    <bom> 
     <Part-number>003</Part-number> 
    </bom> 
</Allboms> 

</Collection> 

必要な出力:

<Collection> 

<Allparts> 

    <part> 
     <number>001</number> 
     <material>Platinum</material> 
     <price>High</price> 
    </part> 

    <part> 
     <number>002</number> 
     <material>Gold</material> 
     <price>Medium</price> 
    </part> 

    <part> 
     <number>003</number> 
     <material>Silver</material> 
     <price>Low</price> 
    </part> 


</Allparts> 

<Allboms> 

    <bom> 
     <Part-number>001</Part-number> 
     <material>Platinum</material> 
     <price>High</price> 
    </bom> 

    <bom> 
     <Part-number>002</Part-number> 
     <material>Gold</material> 
     <price>Medium</price> 
    </bom> 

    <bom> 
     <Part-number>003</Part-number> 
     <material>Silver</material> 
     <price>Low</price> 
    </bom> 
</Allboms> 

</Collection> 

私が試みXML:

<xsl:template match="bom"> 
    <xsl:copy> 
     <xsl:choose > 
      <xsl:when test= "../../bom/Part-number=../../part/number" > 
      <xsl:apply-templates select= "../../part/material" mode="move" /> 
      </xsl:when > 
     </xsl:choose > 
     <xsl:apply-templates select= "@*|node()" /> 

    </xsl:copy> 

    </xsl:template> 

修正を提案してください:

+0

ルックアップテーブルを作成して検索するには、 ''と 'key(...)'関数を読む必要があります。 –

+0

あなたはどのXSLTバージョンを使用していますか? XSLT-1.0またはXSLT-2.0? –

+1

@LingamurthyCS私は '

答えて

0

以下XSLT-1.0ソリューションそれを行う必要があります:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
    <xsl:strip-space elements="*"/> 


    <xsl:template match="Allboms/bom/Part-number"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
     <xsl:apply-templates select="/Collection/Allparts/part[number = current()]/material | /Collection/Allparts/part[number = current()]/price"/> 
    </xsl:template> 

    <!-- Identity transform template --> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

2つのテンプレートがあります。

  1. アイデンティティは、テンプレートを変換:入力文書から-であるとして、それは、属性ノードを対処します。
  2. Part-numberと一致するテンプレートは、それ自体をコピーし、それぞれとpriceAllpartsからコピーします。 @JimGarrison

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    
        <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
        <xsl:strip-space elements="*"/> 
    
        <xsl:key name="material-by-num" match="/Collection/Allparts/part/material" use="../number"/> 
        <xsl:key name="price-by-num" match="/Collection/Allparts/part/price" use="../number"/> 
    
        <xsl:template match="Allboms/bom/Part-number"> 
         <xsl:copy> 
          <xsl:apply-templates select="@* | node()"/> 
         </xsl:copy> 
         <xsl:apply-templates select="key('material-by-num', .) | key('price-by-num', .)"/> 
        </xsl:template> 
    
        <xsl:template match="@* | node()"> 
         <xsl:copy> 
          <xsl:apply-templates select="@* | node()"/> 
         </xsl:copy> 
        </xsl:template> 
    
    </xsl:stylesheet> 
    

    上記XSLTはその兄弟numberの値を使用してmaterialpriceと一致するために2つのキーの宣言を使用することによって示唆されるようにキーを使用

Part-numberのテンプレートは、これらのキーを使用して、requried要素をコピーします。

+1

ありがとう:)それはwoked –

関連する問題