Filtrer les résultats d'un 'for-each'
Bonjour à tous !
J'ouvre une discussion dans l'espoir que quelqu'un puisse me guider dans la génération d'un fichier xslt.
Je dois modifier un fichier xslt afin d'obtenir un résultat
Voici mon fichier xml d'entrée :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| <?xml version="1.0" encoding="utf-8"?>
<OrderProgressStatus>
<SessionContext>
<PropertyBagV2>
<Item Name="LabelWithContainer">
<ValueList>
<Value>401717371/L1709347</Value>
<Value>401717372/L1709349</Value>
<Value>401717373/L1709350</Value>
</ValueList>
</Item>
<Item Name="PIPackagingType">
<ValueList>
<Value>UC/L1709347</Value>
<Value>UC/L1709349</Value>
<Value>UM/L1709350</Value>
</ValueList>
</Item>
<Item Name="MainPackagingkMaterial">
<ValueList>
<Value>C13/L1709347</Value>
<Value>C14/L1709349</Value>
<Value>PALGEN/L1709350</Value>
</ValueList>
</Item>
<Item Name="PalletContainer">
<ValueList>
<Value>L1709350/PALGEN</Value>
</ValueList>
</Item>
</PropertyBagV2>
</SessionContext>
<PackingConfirmation>
<OrderDetail>
<PackingContainer>
<PackingMaterial>
<PackingProductNo>C13</PackingProductNo>
<PackingQuantity>1.0000000000</PackingQuantity>
</PackingMaterial>
<PackingMaterial>
<PackingProductNo>C40</PackingProductNo>
<PackingQuantity>1.0000000000</PackingQuantity>
</PackingMaterial>
<PackingMaterial>
<PackingProductNo>C9</PackingProductNo>
<PackingQuantity>4.0000000000</PackingQuantity>
</PackingMaterial>
</PackingContainer>
<PackingContainer>
<PackingMaterial>
<PackingProductNo>C13</PackingProductNo>
<PackingQuantity>1.0000000000</PackingQuantity>
</PackingMaterial>
<PackingMaterial>
<PackingProductNo>C40</PackingProductNo>
<PackingQuantity>1.0000000000</PackingQuantity>
</PackingMaterial>
<PackingMaterial>
<PackingProductNo>C9</PackingProductNo>
<PackingQuantity>4.0000000000</PackingQuantity>
</PackingMaterial>
</PackingContainer>
</OrderDetail>
</PackingConfirmation>
</OrderProgressStatus> |
Voici le fichier xml de sortie que je dois générer grâce au xslt :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
<DELVRY03>
<IDOC BEGIN="1">
<E1EDL37 SEGMENT="1">
<E1EDL44 SEGMENT="1">
<VELIN>2</VELIN>
<VEMNG>1</VEMNG>
<MATNR>C40</MATNR>
</E1EDL44>
<E1EDL44 SEGMENT="1">
<VELIN>2</VELIN>
<VEMNG>3</VEMNG>
<MATNR>C9</MATNR>
</E1EDL44>
</E1EDL37>
<E1EDL37 SEGMENT="1">
<E1EDL44 SEGMENT="1">
<VELIN>2</VELIN>
<VEMNG>1</VEMNG>
<MATNR>C40</MATNR>
</E1EDL44>
<E1EDL44 SEGMENT="1">
<VELIN>2</VELIN>
<VEMNG>3</VEMNG>
<MATNR>C9</MATNR>
</E1EDL44>
</E1EDL37>
</IDOC>
</DELVRY03> |
J'essaye depuis quelques jours de confronter les valeurs
Code:
1 2 3 4 5
| <ValueList>
<Value>C13/L1709347</Value>
<Value>C14/L1709349</Value>
<Value>PALGEN/L1709350</Value>
</ValueList> |
avec les valeurs
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
<PackingMaterial>
<PackingProductNo>C13</PackingProductNo>
<PackingQuantity>1.0000000000</PackingQuantity>
</PackingMaterial>
<PackingMaterial>
<PackingProductNo>C40</PackingProductNo>
<PackingQuantity>1.0000000000</PackingQuantity>
</PackingMaterial>
<PackingMaterial>
<PackingProductNo>C9</PackingProductNo>
<PackingQuantity>4.0000000000</PackingQuantity>
</PackingMaterial> |
pour que quand : subtring.before(<Value>C13/L1709347</Value>, '/') match avec <PackingProductNo>C13</PackingProductNo> ça ne créé pas de segment <E1EDL44 SEGMENT="1"> dans le fichier xml de sortie.
Voici le fichier xslt sur lequel je travaille :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
<xsl:for-each select="$var4_FlexNetBusinessRulesDeliveryPackingConfirmation/ns0:OrderDetail">
<xsl:variable name="var25_OrderDetail" select="."/>
<xsl:for-each select="$var25_OrderDetail/ns0:PackingContainer">
<xsl:variable name="var25_OrderDetail_PackingContainer_Container" select="."/>
<xsl:variable name="var36_result_LengthGreaterThanZero">
<xsl:call-template name="LengthGreaterThanZero">
<xsl:with-param name="Value" select="$var25_OrderDetail_PackingContainer_Container/ns0:Quantity"/>
</xsl:call-template>
</xsl:variable>
<xsl:choose>
<xsl:when test="string((('0' != normalize-space($var36_result_LengthGreaterThanZero)) and ('false' != normalize-space($var36_result_LengthGreaterThanZero)))) != 'false'">
<E1EDL37>
<xsl:attribute name="SEGMENT">
<xsl:value-of select="'1'"/>
</xsl:attribute>
<xsl:for-each select="$var25_OrderDetail_PackingContainer_Container/ns0:PackingMaterial/ns0:PackingProductNo">
<xsl:variable name="get_PackingProductNo" select="."/>
<E1EDL44><xsl:value-of select="$get_PackingProductNo"/></E1EDL44>
<xsl:for-each select="$var2_FlexNetBusinessFacadeCommonOrderProgressStatus/ns0:SessionContext/ns0:PropertyBagV2/ns0:Item/ns0:ValueList/ns0:Value">
<xsl:variable name="var_Value_MainPI" select="."/>
<xsl:variable name="var_Value_MainPI_exists">
<xsl:if test="string(boolean(../../@Name)) != 'false'">
<xsl:if test="string(('MainPackagingkMaterial' = string(../../@Name))) != 'false'">
<xsl:value-of select="'1'"/>
</xsl:if>
</xsl:if>
</xsl:variable>
<xsl:if test="string(boolean(string($var_Value_MainPI_exists))) != 'false'">
<xsl:variable name="var_Select_PackingProductNo">
<xsl:if test="substring-before($var_Value_MainPI, '/') != $get_PackingProductNo">
<xsl:value-of select="'1'"/>
</xsl:if>
</xsl:variable>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</E1EDL37>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:for-each> |
J'ai réalisé plusieurs tests, et la plupart du temps j'obtiens 3*3 : 9 résultats, ce qui est beaucoup plus que ce que je devrais obtenir (2)
Merci d'avance de votre aide ! :)
Clara