2017-06-19 116 views
1

我在這個例子中的文件有問題,減去:減去XSLT 1.0

<EVENTS> 
<ROW ID="204" ID_PLACE="1" EVENT_TYPE="B" EVENT_NAME="TEST1" EVENT_ID="201"> 
<PRICE> 
<ROW EVENT_PRICE="165,00"/> 
</PRICE> 
</ROW> 
<ROW ID="205" ID_PLACE="1" EVENT_TYPE="P" EVENT_NAME="TEST1" EVENT_ID="201"> 
<PRICE> 
<ROW EVENT_PRICE="125,00"/> 
</PRICE> 
</ROW> 
</EVENTS> 

她是一個相關的一塊我的XSLT:

<xsl:for-each select="EVENTS/ROW/PRICE/ROW"> 
    <xsl:variable name="event_b"> 
    <xsl:choose> 
     <xsl:when test="EVENT_TYPE=B"> 
     <xsl:value-of select="EVENT_PRICE" /> 
     </xsl:when> 
    </xsl:choose> 
    </xsl:variable> 
    <xsl:variable name="event_p"> 
    <xsl:choose> 
     <xsl:when test="EVENT_TYPE=P"> 
     <xsl:value-of select="EVENT_PRICE" /> 
     </xsl:when> 
    </xsl:choose> 
    </xsl:variable> 
    <xsl:value-of select="number($event_b) - number($event_p)" /> 
</xsl:for-each> 

我必須減去從P型event_price對應一個類型B.在這個例子中,我想得到一個結果40,並將其輸出到結果樹中,但它不起作用。怎麼了?

+0

發佈你的代碼,所以我們不必猜測你的問題是什麼。 - 提示:爲了將價格識別爲數字,您需要將逗號轉換爲點。 –

+0

請不要在評論中張貼代碼 - 而是編輯您的問題。還要確保你的代碼是**完整的** - 見:[mcve]。 –

+0

我需要這個165,00-125,00 = 40,00的結果。我的數字格式沒有問題。我在顯示一個名爲event_price_subtract的節點中減去一個結果的問題。 – jeffers

回答

0

您正在嘗試將字符串轉換爲數字,但這些字符串未針對XSL/XPath/XSI編號正確格式化。具體而言,number()構造函數只將句點('。')字符識別爲小數分隔符,但輸入字符串似乎在該角色中使用逗號(',')。

如果您無法更正數據以遵循主流約定來表示十進制數,那麼您需要在樣式表中考慮變體約定。您可以使用translate函數執行此操作。

甚至在你到達那裏,但是,你有嚴重的問題,在樣式表結構,其中:

  • 您的外xsl:for-each沒有意義。您正在遍歷單個(內部)<ROW>,但您打算處理對應行的。一個方便的背景將是最接近的共同祖先,儘管還有其他方法來解決這個問題。

  • 您的selecttest表達式正試圖引用子元素,您的意思是指引用屬性。

  • 在某些地方,您的測試正在比較(不存在的)子元素而不是字符串值。

總的來說,你做得比它需要的要難得多。對於你提出的輸入,你可能會這樣做:

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

    <xsl:template match="EVENTS"> 
    <!-- Note @attribute_name syntax for referring to attributes --> 
    <!-- Note quoted form for string literals --> 
    <!-- Note that these expressions are evaluated relative to the EVENTS element 
     matched by this template --> 
    <!-- Note no iteration: each value wanted is identified via an 
     appropriate XPath expression --> 
    <!-- Note use of a select expression to specify the variables' values. 
     That doesn't make much difference in this particular case, but it 
     _is_ significant. --> 
    <xsl:variable name="event_b" 
     select="ROW[@EVENT_TYPE = 'B']/PRICE/ROW/@EVENT_PRICE"/> 
    <xsl:variable name="event_p" 
     select="ROW[@EVENT_TYPE = 'P']/PRICE/ROW/@EVENT_PRICE"/> 

    <!-- Note use of translate() to translate commas to periods before converting 
     to numbers --> 
    <xsl:value-of select="number(translate($event_b, ',', '.')) - number(translate($event_p, ',', '.'))" /> 
    </xsl:template> 

</xsl:stylesheet>