2016-09-22 16 views
0

CSVをXMLに変換するために使用されるXSLTがあります。 csvの2番目の列には、5,0000などの数字が含まれています。カンマをXSLのドットで置き換えてください。

私はこの数値を5.0000またはそれ以上に変換する必要があります。 1つの可能性があるか、または小数点記号を切り捨てて、それに続くものを切り捨てます。

私はgoogelingとフォーラムで検索したすべてを考慮して、translate()、format-number()、number()を何時間も試してきました。残念ながら私はこれまでのところそれを動作させることはできませんでした。私が何をしようとしても、エラーのためにスタイルシートをコンパイルすることができなかったという唯一のエラーメッセージです。入力ファイルがCSVでXMLではないので、私が知る限りデバッグはできません 誰かが私を助けてくれますか?

は、入力例(CSV)とXSL以下(変更する変数がtestAmountと呼ばれている)を参照してください:私は必要なもの

9612045901;5,000;Stk.;SomeText 1;M;72,04 
5-10495;1,000;Stk.;SomeText 2;M;5,93 
9612045901;5,000;Stk.;SomeText 3;72,04 
5-10495;1,000;Stk.;SomeText 4;M;5,93 


<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="fn" exclude-result-prefixes="xs fn"> 
<xsl:output indent="yes" encoding="UTF-8" /> 
<xsl:param name="csvFile"/> 

<!-- 
Constants 
--> 
<xsl:variable name="V_ITEM_POS" select="number(1)" /> 
<xsl:variable name="V_ITEM_DESC_POS" select="number(4)" /> 
<xsl:variable name="V_AMOUNT_POS" select="number(2)" /> 
<xsl:variable name="V_ZONE">ZONE1</xsl:variable> 
<xsl:variable name="V_PRIORITY">9</xsl:variable> 
<!-- 
    EVENTUELL SHPG & RECV für IBD & OBD UNTERSCHEIDEN !!! 
--> 
<xsl:variable name="V_IBD_TYPE_ID">SHPG</xsl:variable> 


<!-- 
MAIN 
--> 
<xsl:template match="/" name="main"> 
    <xsl:variable name="csv" select="unparsed-text($csvFile)" /> 
    <xsl:variable name="lines" select="tokenize($csv, '&#xA;')" as="xs:string+" /> 
    <xsl:variable name="orderNumber" select="format-dateTime(current-dateTime(), '[Y0001][M01][D01][H01][m01][s01][f0001]')" /> 
    <!-- 

    Determine inbound or outbound order 

    positiv amound will create an inbound order 
    negative amound will create an outbound order 

    Test at first value line 
    --> 
    <xsl:for-each select="$lines"> 
    <xsl:variable name="rowPos" select="position()" /> 
    <xsl:if test="$rowPos = 1"> 
     <xsl:variable name="testLineItems" select="tokenize(., ';')" /> 
     <xsl:variable name="testAmount" select="number($testLineItems[$V_AMOUNT_POS])" /> 
     <!-- 
      INBOUND DELIVERY 
     --> 
     <xsl:if test="$testAmount &lt; 0"> 
      <xsl:call-template name="TMPL_INBOUND_DELIVERY"> 
       <xsl:with-param name="in_lines" select="$lines" /> 
       <xsl:with-param name="in_orderNumber" select="$orderNumber" /> 
      </xsl:call-template> 
     </xsl:if> 
     <!-- 
      OUTBOUND DELIVERY 
     --> 
     <xsl:if test="$testAmount &gt; 0"> 
      <xsl:call-template name="TMPL_OUTBOUND_DELIVERY"> 
       <xsl:with-param name="in_lines" select="$lines" /> 
       <xsl:with-param name="in_orderNumber" select="$orderNumber" /> 
      </xsl:call-template> 
     </xsl:if> 

    </xsl:if> 
    </xsl:for-each> 
</xsl:template> 
<!-- 

INBOUND DELIVERY TEMPLATE 
--> 
<xsl:template name="TMPL_INBOUND_DELIVERY"> 
    <xsl:param name="in_lines" /> 
    <xsl:param name="in_orderNumber" /> 
    <DI_TELEGRAM> 
    <HEADER> 
     <FULL> 
      <HEADER_SOURCE>HOST</HEADER_SOURCE> 
      <HEADER_DESTINATION>WAMAS</HEADER_DESTINATION> 
      <HEADER_SEQUENCE>1</HEADER_SEQUENCE> 
      <HEADER_RECORDTYPENAME>LOGIMATIBD00001</HEADER_RECORDTYPENAME> 
     </FULL> 
    </HEADER> 
    <BODY> 
     <LogimatIbdGroup> 
      <LOGIMATIBD00001> 
       <InboundDelivery_ibdNo> 
       <xsl:value-of select="$in_orderNumber" /> 
       </InboundDelivery_ibdNo> 
       <InboundDelivery_priority> 
       <xsl:value-of select="$V_PRIORITY" /> 
       </InboundDelivery_priority> 
       <InboundDelivery_deliveryNoteNo></InboundDelivery_deliveryNoteNo> 
       <InboundDelivery_type_ibdTypeId> 
       <xsl:value-of select="$V_IBD_TYPE_ID" /> 
       </InboundDelivery_type_ibdTypeId> 
       <InboundDelivery_externalRef></InboundDelivery_externalRef> 
       <InboundDelivery_unloadingPoint_area_areaId> 
       <xsl:value-of select="$V_ZONE" /> 
       </InboundDelivery_unloadingPoint_area_areaId> 
       <LOGIMATIBD00001_subList> 
       <xsl:for-each select="$in_lines"> 
        <xsl:variable name="lineItems" select="tokenize(., ';')" /> 
         <!-- remove empty lines --> 
         <xsl:if test="number($lineItems[$V_AMOUNT_POS])!= number(0)"> 
          <xsl:call-template name="TMPL_INBOUND_DELIVERY_LINE"> 
          <xsl:with-param name="in_orderNumber" select="$in_orderNumber" /> 
          <xsl:with-param name="in_sysPartnerLine" select="position() -1" /> 
          <xsl:with-param name="in_itemNumber" select="$lineItems[$V_ITEM_POS]" /> 
          <xsl:with-param name="in_amount" select="$lineItems[$V_AMOUNT_POS]" /> 
          </xsl:call-template> 
         </xsl:if> 
       </xsl:for-each> 
       </LOGIMATIBD00001_subList> 
      </LOGIMATIBD00001> 
     </LogimatIbdGroup> 
    </BODY> 
    </DI_TELEGRAM> 
</xsl:template> 
<!-- 

INBOUND DELIVERY LINE TEMPLATE 
--> 
<xsl:template name="TMPL_INBOUND_DELIVERY_LINE"> 
    <xsl:param name="in_orderNumber" /> 
    <xsl:param name="in_sysPartnerLine" /> 
    <xsl:param name="in_itemNumber" /> 
    <xsl:param name="in_amount" /> 
    <LOGIMATIBDL00001> 
    <InboundDeliveryLine_InboundDelivery_ibdNo> 
     <xsl:value-of select="$in_orderNumber" /> 
    </InboundDeliveryLine_InboundDelivery_ibdNo> 
    <InboundDeliveryLine_sysPartnerLine> 
     <xsl:value-of select="$in_sysPartnerLine" /> 
    </InboundDeliveryLine_sysPartnerLine> 
    <InboundDeliveryLine_iga_pkv_Item_itemNo> 
     <xsl:value-of select="$in_itemNumber" /> 
    </InboundDeliveryLine_iga_pkv_Item_itemNo> 
    <InboundDeliveryLine_iga_batch></InboundDeliveryLine_iga_batch> 
    <InboundDeliveryLine_iga_bbDate></InboundDeliveryLine_iga_bbDate> 
    <InboundDeliveryLine_orderAmount_baseQty> 
     <xsl:value-of select="$in_amount" /> 
    </InboundDeliveryLine_orderAmount_baseQty> 
    </LOGIMATIBDL00001> 
</xsl:template> 
<!-- 

OUTBOUND DELIVERY TEMPLATE 
--> 
<xsl:template name="TMPL_OUTBOUND_DELIVERY"> 
    <xsl:param name="in_lines" /> 
    <xsl:param name="in_orderNumber" /> 
    <DI_TELEGRAM> 
    <!-- The document root --> 
    <HEADER> 
     <FULL> 
      <HEADER_SOURCE>HOST</HEADER_SOURCE> 
      <HEADER_DESTINATION>WAMAS</HEADER_DESTINATION> 
      <HEADER_SEQUENCE>1</HEADER_SEQUENCE> 
      <HEADER_RECORDTYPENAME>LOGIMATOBD00001</HEADER_RECORDTYPENAME> 
     </FULL> 
    </HEADER> 
    <BODY> 
     <!-- The content data --> 
     <LogimatObdGroup> 
      <LOGIMATOBD00001> 
       <OutboundDelivery_obdNo> 
       <xsl:value-of select="$in_orderNumber" /> 
       </OutboundDelivery_obdNo> 
       <OutboundDelivery_priority> 
       <xsl:value-of select="$V_PRIORITY" /> 
       </OutboundDelivery_priority> 
       <OutboundDelivery_deliveryTime></OutboundDelivery_deliveryTime> 
       <OutboundDelivery_deliveryNoteNo></OutboundDelivery_deliveryNoteNo> 
       <OutboundDelivery_type_obdTypeId> 
       <xsl:value-of select="$V_IBD_TYPE_ID" /> 
       </OutboundDelivery_type_obdTypeId> 
       <OutboundDelivery_externalRef></OutboundDelivery_externalRef> 
       <Zone> 
       <xsl:value-of select="$V_ZONE" /> 
       </Zone> 
       <LOGIMATOBD00001_subList> 
       <xsl:for-each select="$in_lines"> 
        <xsl:variable name="lineItems" select="tokenize(., ';')" /> 
         <!-- remove empty lines --> 
         <xsl:if test="number($lineItems[$V_AMOUNT_POS])"> 
          <xsl:call-template name="TMPL_OUTBOUND_DELIVERY_LINE"> 
          <xsl:with-param name="in_orderNumber" select="$in_orderNumber" /> 
          <xsl:with-param name="in_sysPartnerLine" select="position() -1" /> 
          <xsl:with-param name="in_itemNumber" select="$lineItems[$V_ITEM_POS]" /> 
          <xsl:with-param name="in_amount" select="number($lineItems[$V_AMOUNT_POS]) * -1" /> 
          </xsl:call-template> 
         </xsl:if> 
       </xsl:for-each> 
       </LOGIMATOBD00001_subList> 
      </LOGIMATOBD00001> 
     </LogimatObdGroup> 
    </BODY> 
    </DI_TELEGRAM> 
</xsl:template> 
<!-- 

OUTBOUND DELIVERY LINE TEMPLATE 
--> 
<xsl:template name="TMPL_OUTBOUND_DELIVERY_LINE"> 
    <xsl:param name="in_orderNumber" /> 
    <xsl:param name="in_sysPartnerLine" /> 
    <xsl:param name="in_itemNumber" /> 
    <xsl:param name="in_amount" /> 
    <LOGIMATOBDL00001> 
    <OutboundDeliveryLine_OutboundDelivery_obdNo> 
     <xsl:value-of select="$in_orderNumber" /> 
    </OutboundDeliveryLine_OutboundDelivery_obdNo> 
    <OutboundDeliveryLine_sysPartnerLine> 
     <xsl:value-of select="$in_sysPartnerLine" /> 
    </OutboundDeliveryLine_sysPartnerLine> 
    <OutboundDeliveryLine_oga_pkv_Item_itemNo> 
     <xsl:value-of select="$in_itemNumber" /> 
    </OutboundDeliveryLine_oga_pkv_Item_itemNo> 
    <OutboundDeliveryLine_oga_batch></OutboundDeliveryLine_oga_batch> 
    <OutboundDeliveryLine_oga_bbDate></OutboundDeliveryLine_oga_bbDate> 
    <OutboundDeliveryLine_orderAmount_baseQty> 
     <xsl:value-of select="$in_amount" /> 
    </OutboundDeliveryLine_orderAmount_baseQty> 
    </LOGIMATOBDL00001> 
</xsl:template> 
</xsl:stylesheet> 
+0

あなたは ''と 'format-number(123.456、xyz、 'random' ) '? – uL1

+0

例を最小限にして、問題を実証するために必要なものだけを考えてみてください。[mcve]を参照してください。 –

+0

エラーが発生したことを教えてください。エラーの内容を教えてください。あなたはそれを理解していないかもしれませんが、私たちはそうしています。 –

答えて

0

をわずか5 5.0000にこの番号を変換するためにあるかさえ良く、 。 $testAmountもし

はその後、文字列5,0000含まれています

translate($testAmount, ',', '.') 

5.0000を返します:

substring-before($testAmount, ',') 

5を返します。

0

あなたがこれを行うと:

<xsl:variable name="testAmount" select="number($testLineItems[$V_AMOUNT_POS])" /> 

あなたの入力ラインに第二のトークンを取り、その数に変換しています。これは入力が "5,0000"なのでNaNを与えます。を数値に変換する前に、文字列 "5.0000" に変換する必要があります。

変数の型を宣言すると、この種の問題を診断する方がずっと簡単です。文字列の場合はas="xs:string*"を、文字列の場合はas="xs:double"を追加します。また、コードを読みやすく理解しやすくし、パフォーマンスを向上させることができます。

関連する問題