2016-10-10 24 views
1

非常に統一された入力XMLを持っています。私は非常にカスタマイズされたXMLに変換する必要があります。 これを行うには、XSLの別の場所で名前テンプレートを呼び出そうとしています。特定のノードで名前付きxsltテンプレートを呼び出す方法

<xsl:template match="/"> 

    <workspace> 
     <data> 
      <xsl:apply-templates select="/data/data_set[@id='id1']" />     
      <xsl:apply-templates select="/data/data_set[@id='id2']" />     
      <xsl:apply-templates select="/data/data_set[@id='id3']" />     
     </data> 
    </workspace> 

</xsl:template> 


<xsl:template match="/data/data_set[@id='id1']">    
    <xsl:call-template name="attribute">        
     <xsl:with-param name="id" select="'some_value1'" /> 
     <xsl:with-param name="type" select="'some_value2'" /> 
    </xsl:call-template> 
</xsl:template> 

<xsl:template match="/data/data_set[@id='id2']">    
    <xsl:call-template name="attribute">        
     <xsl:with-param name="id" select="'some_other_value1'" /> 
     <xsl:with-param name="type" select="'some_other_value2'" /> 
    </xsl:call-template> 
</xsl:template> 

<xsl:template match="/data/data_set[@id='id3']">    
    <xsl:call-template name="attribute">        
     <xsl:with-param name="id" select="'some_third_value1'" /> 
     <xsl:with-param name="type" select="'some_third_value2'" /> 
    </xsl:call-template> 
</xsl:template> 

<xsl:template name="attribute"> 
    <xsl:param name="id" /> 
    <xsl:param name="type" />  

    <!-- Write the attribute node --> 
    <attribute attribute_id="{$id}" attribute_value_type="{$type}">   
     <xsl:for-each select="data_point"> 
      <element> 
       <xsl:attribute name="id"><xsl:value-of select="@key" /></xsl:attribute> 
       <xsl:attribute name="{$type}"><xsl:value-of select="@value" /></xsl:attribute>           
      </element> 
     </xsl:for-each> 
    </attribute>    

</xsl:template> 

行うには良い方法があります:私の問題は、(問題を説明するために簡略化した例)このような非常に長いと冗長コードで、その結果、テンプレートを呼び出すとき、ノードを選択することはできないということですこのすべての冗長性を避けるためにこれは?私が望むことは、コールテンプレートで選択を行うことができないので、これを書くことです(しかしこれは有効なXSLTではありません)。

<xsl:template match="/"> 
    <workspace> 
     <data> 
     <xsl:call-template name="attribute" select="/data/data_set[@id='id1']">       
      <xsl:with-param name="id" select="'some_value1'" /> 
      <xsl:with-param name="type" select="'some_value2'" /> 
     </xsl:call-template> 
     <xsl:call-template name="attribute" select="/data/data_set[@id='id2']">       
      <xsl:with-param name="id" select="'some_other_value1'" /> 
      <xsl:with-param name="type" select="'some_other_value2'" /> 
     </xsl:call-template> 
     <xsl:call-template name="attribute" select="/data/data_set[@id='id3']">       
      <xsl:with-param name="id" select="'some_third_value1'" /> 
      <xsl:with-param name="type" select="'some_thrid_value2'" /> 
     </xsl:call-template>   
     </data> 
    </workspace> 
</xsl:template> 

サンプル入力:

<?xml version="1.0" encoding="utf-8"?> 
<data> 
     <data_set id="id1"> 
     <data_point value="1" key="4"/> 
     <data_point value="2" key="5"/> 
     <data_point value="3" key="6"/> 
     </data_set> 
     <data_set id="id2"> 
     <data_point value="1" key="4"/> 
     <data_point value="2" key="5"/> 
     <data_point value="3" key="6"/> 
     </data_set> 
     <data_set id="id3"> 
     <data_point value="1" key="4"/> 
     <data_point value="2" key="5"/> 
     <data_point value="3" key="6"/> 
     </data_set> 
</data> 

出力例:

<?xml version="1.0" encoding="utf-8"?> 
<workspace> 
    <data> 
     <attribute id="some_value1" type="some_value2"> 
      <element id="4" some_value2="1"/> 
      <element id="5" some_value2="2"/> 
      <element id="6" some_value2="3"/> 
     </attribute> 
     <attribute id="some_other_value1" type="some_other_value2"> 
      <element id="4" some_other_value2="1"/> 
      <element id="5" some_other_value2="2"/> 
      <element id="6" some_other_value2="3"/> 
     </attribute> 
     <attribute id="some_third_value1" type="some_third_value2"> 
      <element id="4" some_third_value2="1"/> 
      <element id="5" some_third_value2="2"/> 
      <element id="6" some_third_value2="3"/> 
     </attribute> 
    </data> 
</workspace>  
+0

入力の例と予想される出力が含まれていれば、問題ははるかによく説明されます。 –

+0

さて、私たちは、呼び出されたテンプレートが何をしているのかわからないので、それはまだ謎です。これらのパラメータは完全に恣意的ですか?あるいは、彼らは何とか '@ id'から派生することができますか? –

+0

call-templateを見ることはできますか?多分私たちはこれを打つことができます。したがって、冗長性も少なくなります。しかし、私たちは見ることができない、私たちは変更することはできません。 – uL1

答えて

0

それが呼ばれるテンプレートがマッチしdata_setの文脈を与えていることが重要だ場合、私はあなたがそれを行うことをお勧めこれらの線に沿って:

<xsl:template match="/data"> 
    <workspace> 
     <data> 
      <xsl:apply-templates select="data_set[@id='id1' or id='id2' or id='id3']" />     
     </data> 
    </workspace> 
</xsl:template> 

<xsl:template match="data_set">    
    <xsl:call-template name="attribute"> 
     <xsl:with-param name="id"> 
      <xsl:choose> 
       <xsl:when test="@id='id1'">some_value1</xsl:when> 
       <xsl:when test="@id='id2'">some_other_value1</xsl:when> 
       <xsl:when test="@id='id3'">some_third_value1</xsl:when> 
      </xsl:choose> 
     </xsl:with-param> 
     <xsl:with-param name="type"> 
      <xsl:choose> 
       <xsl:when test="@id='id1'">some_value2</xsl:when> 
       <xsl:when test="@id='id2'">some_other_value2</xsl:when> 
       <xsl:when test="@id='id3'">some_third_value3</xsl:when> 
      </xsl:choose> 
     </xsl:with-param> 
    </xsl:call-template> 
</xsl:template> 

これは、XSLT 1.0を使用していることを前提としています。 XSLT 2.0で少し冗長である可能性があります。

+0

ありがとう、私はあなたが示唆した 'mode'を使って、これらの行に沿って何かをやってしまいました。私は冗長という点で合理的に満足しています。 – user3124206

関連する問題