2011-09-13 9 views
0

xml形式を他のxml形式に変換するには、私はxslを使用しています。私のxslファイルにはいくつかのテンプレートが書かれています。 私は以下のようにいくつかの問題を翻訳オーダーに直面しています。xslを使用したxmlファイルの順序に基づく構文解析

私のXSLテンプレート:

<xsl:template match="rhs" name="rhsTemplate"> 

       <xsl:if test="brl:retract | retract!= ''"> 
        <xsl:for-each select="brl:retract | retract"> 
         <xsl:element name="freeForm"> 
          <xsl:element name="text"> 
           <xsl:apply-templates select="." /> 
          </xsl:element> 
         </xsl:element> 
        </xsl:for-each> 
       </xsl:if> 


    <xsl:if test="brl:tryCatchBlock | tryCatchBlock!= ''"> 
         <xsl:if test="brl:tryCatchBlock/brl:try | tryCatchBlock/try!= ''"> 
          <xsl:element name="freeForm"> 
           <xsl:element name="text"> 
            <xsl:text>try{</xsl:text> 
           </xsl:element> 
          </xsl:element> 


</xsl:template> 

私は1を希望されていない出力を取得しています入力として、次のXMLファイルを送信します。

       <rhs> 
           <tryCatchBlock identifier="8" order="0"> 
           <try> 
           </try> 
           </tryCatchBlock> 
       <retract identifier="1" order="1"> 
        <variableName>$Event1</variableName> 
       </retract> 

出力:

<freeForm> 
<text>retract($Event1);</text> 
</freeForm> 
<freeForm> 
<text>try{</text> 
</freeForm> 

所望の出力:

<freeForm> 
<text>try{</text> 
</freeForm> 
<freeForm> 
<text>retract($Event1);</text> 
</freeForm> 

私のrequirmentは、翻訳は、入力XMLファイルに基づいて発生する必要がXSLテンプレート内の条件にかかわらず、であるorder.Here私のxslテンプレートで私は持っています私は持っていますtrycatchの前に収縮のための条件 "retract"のための翻訳が起こっている場合condition.hence最初に翻訳してtrycatchタグ私の入力x mlには、retractタグの前にtrycatchタグが含まれています。

入力XMLコンテンツの順序に基づいて翻訳を行うためのいくつかのポインタを提供してください。 しかし、希望の出力は以下の通りです(入力xmlの順)。

+0

私はあなたの問題を詳細に研究していませんが、一見すると 'brl:retract | retract!= '' '..これは' brl:retract | brl:retract!= '' '?すなわち、名前空間は 'retract'要素への2番目の参照で指定されていません。 – Flynn1179

+0

ええ、それはbrlです:retract | retract!= '' only.sometimes xmlファイルにnamespaceが付いてくることがありますが、これを処理するためにnamespace.toを使用しない場合もあります。両方のシナリオを追加しました。 – mohan

答えて

0

あなたの出力はテンプレートの出力方法であるため、その順番になります。それは具体的には 'retract'ブロックを出力してからtry/catchブロックを出力します。

私はわずかな再設計をお勧めします:

<xsl:template match="rhs" name="rhsTemplate"> 
    <xsl:apply-templates /> 
</xsl:template> 

<xsl:template match="retract"> 
    <xsl:element name="freeForm"> 
    <xsl:element name="text"> 
     <xsl:apply-templates/> 
    </xsl:element> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="tryCatchBlock"> 
    <xsl:element name="freeForm"> 
    <xsl:element name="text"> 
     <xsl:text>try{</xsl:text> 
    </xsl:element> 
    </xsl:element> 
</xsl:template> 

最初のテンプレートが余計かもしれません。とにかくXSLTはこれをデフォルトで行いますが、名前が付けられているとすれば、その理由があると思いました。

明らかに、名前空間の問題に対応するには、これを拡張する必要があります。正直言って、テキストretract(がどこから来ているのかはっきりしていませんが、うまくいけば、この解決策はあなたにいくつかの指針を与えるはずです。

関連する問題