2013-11-22 56 views
0

我閱讀了很多文章,但沒有找到對我的問題的確鑿的幫助。檢索有(或沒有)孩子的節點以應用條件模板

我有一個XML文檔,我應用xslt來獲取csv文件作爲輸出。 我向我的xsl轉換髮送一個參數以過濾目標節點以應用模板。

XML文檔看起來像(我刪除了理解一些無用的節點):

<GetMOTransactionsResponse xmlns="http://www.exane.com/pott" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.exane.com/pott PoTTMOTransaction.xsd"> 
<MOTransaction> 
    <Transaction VersionNumber="2" TradeDate="2013-11-20"> 
     <TransactionId Type="Risque">32164597</TransactionId> 
     <InternalTransaction Type="Switch"> 
      <BookCounterparty> 
       <Id Type="Risque">94</Id> 
      </BookCounterparty> 
     </InternalTransaction> 
     <SalesPerson> 
      <Id Type="Risque">-1</Id> 
     </SalesPerson> 
    </Transaction> 
    <GrossPrice>58.92</GrossPrice> 
    <MOAccount Account="TO1E" /> 
    <Entity>0021</Entity> 
</MOTransaction> 
<MOTransaction> 
    <Transaction VersionNumber="1" TradeDate="2013-11-20"> 
     <TransactionId Type="Risque">32164598</TransactionId> 
     <SalesPerson> 
      <Id Type="Risque">-1</Id> 
     </SalesPerson> 
    </Transaction> 
    <GrossPrice>58.92</GrossPrice> 
    <MOAccount Account="TO3E" /> 
    <Entity>0021</Entity> 
</MOTransaction> 
</GetMOTransactionsResponse> 

我的XSLT是低於(抱歉這是相當長的,我寫這更簡單的比它確實是):

<?xml version="1.0" encoding="UTF-8"?> 
    <xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:pott="http://www.exane.com/pott"> 

    <xsl:output method="text" omit-xml-declaration="no" indent="no" /> 

    <xsl:param name="instrumentalSystem"></xsl:param> 

    <xsl:template name="abs"> 
    <xsl:param name="n" /> 
    <xsl:choose> 
     <xsl:when test="$n = 0"> 
     <xsl:text>0</xsl:text> 
     </xsl:when> 
     <xsl:when test="$n &gt; 0"> 
     <xsl:value-of select="format-number($n, '#')" /> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="format-number(0 - $n, '#')" /> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 
    <xsl:template name="outputFormat"> 
    <!--Declaration of variables--> 
    <xsl:variable name="GrossPrice" select="pott:GrossPrice" /> 
    <xsl:variable name="TransactionId" select="pott:Transaction/pott:TransactionId[@Type='Risque']" /> 
    <xsl:variable name="VersionNumber" select="pott:Transaction/@VersionNumber" /> 

    <!--Set tags values--> 
    <xsl:value-of select="$Entity" /> 
    <xsl:text>;</xsl:text> 
    <xsl:value-of select="concat('0000000', pott:MOAccount/@Account) "/> 
    <xsl:text>;</xsl:text> 

    <xsl:text>;</xsl:text> 
    <xsl:value-of select="$TransactionId" /> 
    <xsl:text>;</xsl:text> 
    <xsl:value-of select="$VersionNumber" /> 
    <xsl:text>&#13;&#10;</xsl:text> 
    </xsl:template> 
    <xsl:template match="/"> 
    <xsl:choose> 
     <!-- BB --> 
     <xsl:when test="$instrumentalSystem = 'BB'"> 
     <!--xsl:for-each select="pott:GetMOTransactionsResponse/pott:MOTransaction/pott:Transaction[pott:InternalTransaction]"--> 
     <xsl:for-each select="pott:GetMOTransactionsResponse/pott:MOTransaction/pott:Transaction[pott:InternalTransaction]"> 
      <xsl:call-template name="outputFormat"></xsl:call-template> 
     </xsl:for-each> 
     </xsl:when> 

     <!-- CP --> 
     <xsl:when test="$instrumentalSystem = 'CP'"> 
     <xsl:for-each select="pott:GetMOTransactionsResponse/pott:MOTransaction/pott:Transaction[not(pott:InternalTransaction)]"> 
      <xsl:call-template name="outputFormat"></xsl:call-template> 
     </xsl:for-each> 
     </xsl:when> 

     <xsl:otherwise> 
     </xsl:otherwise> 
    </xsl:choose> 

    </xsl:template> 

</xsl:stylesheet> 

如果參數= BB,我要選擇具有包含InternalTransaction節點的子事務MOTransaction節點。

如果參數= CP,我要選擇沒有包含InternalTransaction節點

當我寫 波特子事務MOTransaction節點:GetMOTransactionsResponse /波特:MOTransaction /波特:事務[pott:InternalTransaction],我得到事務節點而不是MOTransaction節點 我想我離期望的結果並不很遠,但儘管我嘗試了所有嘗試,但是我失敗了。 如果有人能幫助我。

我希望清楚,否則我可以提供更多信息。

回答

0

望着XSL之一: - 每個語句,你這樣做是

<xsl:for-each select="pott:GetMOTransactionsResponse/pott:MOTransaction/pott:Transaction[pott:InternalTransaction]"> 

你說你要選擇MOTransaction元素,但它實際上是選擇孩子交易元素。爲了配合您所需要的邏輯,那它應該是

<xsl:for-each select="pott:GetMOTransactionsResponse/pott:MOTransaction[pott:Transaction[pott:InternalTransaction]]"> 

其實,這應該也行

<xsl:for-each select="pott:GetMOTransactionsResponse/pott:MOTransaction[pott:Transaction/pott:InternalTransaction]"> 

同樣,在第二條語句(在參數的情況下被「CP」) ,它可能看起來像這樣

<xsl:for-each select="pott:GetMOTransactionsResponse/pott:MOTransaction[pott:Transaction[not(pott:InternalTransaction)]]"> 

或者,它可能看起來像這樣

<xsl:for-each select="pott:GetMOTransactionsResponse/pott:MOTransaction[not(pott:Transaction/pott:InternalTransaction)]"> 

他們不太一樣,雖然,作爲第一個將只包括具有交易子元素MOTransaction元素,而第二個將包括MOTransaction沒有任何交易孩子的都沒有。

由於輕微的一邊,你並不真的需要使用的xsl:for-每個的xsl:調用模板這裏。使用模板匹配可能會更好。

首先,嘗試改變命名模板<xsl:template name="outputFormat">這個

<xsl:template match="pott:MOTransaction"> 

然後,你可以重新寫你合併的xsl:for-每個的xsl:調用模板成一個單一的XSL:申請模板通話。

<xsl:apply-template select="pott:GetMOTransactionsResponse/pott:MOTransaction[pott:Transaction/pott:InternalTransaction]" /> 
+0

感謝蒂姆。關於XPath查詢,你是對的。它工作正常。而關於合併成應用模板,我會測試它會給你的結果。但是,感謝您的幫助和所有細節。 – user3013115

+0

添,雙感謝。我的xslt代碼更清晰,並且一切正常。 – user3013115

相關問題