2011-09-13 26 views
0

要將一個xml格式轉換爲其他xml格式,我使用xsl.I在我的xsl文件中寫入了幾個模板。 我正在面對一些問題,如下翻譯順序。解析基於XML文件順序使用xsl

我的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> 

當我發送下面的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> 

我是需求量的不管條件的XSL模板翻譯需要做的基於XML輸入文件order.Here內在我的xsl模板中,如果condition.hence翻譯爲「縮回」首先發生,然後它翻譯trycatch標記,雖然我的輸入x ml在收回標籤之前包含trycatch標籤。

請爲我提供一些指導,根據輸入的xml內容順序進行翻譯。 但是所需的輸出如下(根據輸入xml順序)。

+0

我還沒有詳細研究過你的問題,但是一目瞭然,你已經有'brl:retract |撤回!='''..應該是'brl:撤回| brl:收回!='''?即在第二次引用'retract'元素時沒有指定名稱空間。 – Flynn1179

+0

是的,它是brl:縮回|只有。有時xml文件可能帶有命名空間,有時沒有命名空間。爲了處理這個問題,我添加了兩個senarios。 – mohan

回答

0

您的輸出順序是這樣的,因爲這就是您的模板如何輸出它;它特別輸出任何「回退」塊,然後輸出任何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(來自哪裏,但希望這個解決方案應該給你一些指示。