2016-09-22 2 views
0

Ich habe eine XSLT, die verwendet wird, um eine CSV in eine XML zu verwandeln. Die zweite Spalte des CSV enthält Zahlen wie, d. H. 5.0000Ersetzen Sie Komma durch einen Punkt in XSL

Was ich brauche, ist diese Zahl in 5,0000 oder noch besser, nur 5 zu verwandeln. Bedeutet: Ersetzen Sie die, durch a. wäre eine Möglichkeit oder schneide das Dezimalsymbol und was auch immer folgt.

Ich habe mit translate(), format-number(), number() stundenlang versucht, in Anbetracht alles, was ich mit googeling gefunden und in Foren suchen. Leider habe ich es bisher nicht geschafft. Die einzige Fehlermeldung, die ich bekomme, egal was ich versuche, ist, dass das Stylesheet aufgrund eines Fehlers nicht kompiliert werden konnte. Debugging ist meines Wissens auch nicht möglich, da es sich bei der Eingabedatei um eine CSV und nicht um eine XML handelt. Könnte mir bitte jemand helfen?

Siehe Eingabebeispiel (CSV) und XSL unten (die Variablen zu ändern genannt wird Testa):

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

Haben Sie versucht, etwas mit '' Und 'format-nummer (123.456, xyz, 'random') '? – uL1

+0

Sie sollten das Beispiel auf das beschränken, was zur Veranschaulichung des Problems erforderlich ist - siehe: [mcve]. –

+0

Erzähl uns nicht, dass du einen Fehler hast. Sagen Sie uns, was der Fehler war. Du wirst es vielleicht nicht verstehen, aber wahrscheinlich tun wir es. –

Antwort

0

Was ich brauche, ist diese Zahl in 5.0000 zu verwandeln oder noch besser, nur 5.

Wenn $testAmount enthält die Zeichenfolge5,0000, dann:

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

kehrt 5.0000 und:

substring-before($testAmount, ',') 

5 zurück.

0

Wenn Sie dies tun:

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

Sie sind das zweite Token in Ihrer Eingangsleitung nehmen und in eine Zahl zu konvertieren. Dies ergibt NaN, weil die Eingabe "5,0000" ist. Sie müssen es in die Zeichenfolge "5.0000" vor konvertiert es in eine Zahl konvertieren.

Die Diagnose dieser Art von Problem ist oft viel einfacher, wenn Sie die Typen Ihrer Variablen deklarieren. Fügen Sie as="xs:string*" hinzu, wenn es sich um eine Folge von Strings handelt, as="xs:double", wenn es sich um ein Double handelt, und so weiter. Dadurch wird Ihr Code viel lesbarer und verständlicher und die Leistung kann verbessert werden.

Verwandte Themen