2012-11-05 19 views
0

晚上好專家。我的要求如下。我正在根據不應傳遞的材料轉換目標消息。如果目標消息包含某些材料,則這些材料將從目標中移除。如果僅指定值,繞過XSLT轉換存在

但是,我們還要檢查目標消息是否只包含(僅限於),這些材料則不應該刪除這些材料。

目前下面的代碼是查找和刪除有問題的材料。請建議如何忽略此新要求的轉換。

我正在考慮choose-> when->否則。

非常感謝提前。

<xsl:output method="xml" indent="yes"/> 
    <xsl:template match="node()"> 
     <xsl:copy> 
      <xsl:copy-of select="@*"/> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 

<xsl:template match="E1EDP01[E1EDP19/IDTNR ='407303']"/> 
<xsl:template match="E1EDP01[E1EDP19/IDTNR ='243']"/> 
<xsl:template match="E1EDP01[E1EDP19/IDTNR ='262']"/> 
<xsl:template match="E1EDP01[E1EDP19/IDTNR ='265']"/> 
<xsl:template match="E1EDP01[E1EDP19/IDTNR ='5624']"/> 
<xsl:template match="E1EDP01[E1EDP19/IDTNR ='145416']"/> 

誠摯的歉意: - 樣品輸入只有2行項目,但還是應該創建這個輸出。您可以多次複製E1EDP01位以滿足其他IDTNR值。

謝謝吉姆。

<?xml version="1.0" encoding="UTF-8"?> 
<ORDERS05><IDOC BEGIN="1"> 
<EDI_DC40 SEGMENT="1"> 
    <TABNAM>EDI_DC40</TABNAM> 
    <DIRECT>2</DIRECT> 
    <IDOCTYP>ORDERS05</IDOCTYP> 
    <MESTYP>ORDERS</MESTYP> 
    <SNDPOR>SNDPOR</SNDPOR> 
    <SNDPRT>KU</SNDPRT> 
    <SNDPFC>AG</SNDPFC> 
    <SNDPRN>BWH</SNDPRN> 
    <RCVPOR>RCVPOR</RCVPOR> 
    <RCVPFC>LS</RCVPFC> 
    <RCVPRN>RCVPRN</RCVPRN> 
    </EDI_DC40> 
    <E1EDK01 SEGMENT="1"> 
    <BSART>UB</BSART> 
    <BELNR>4505345253</BELNR> 
    </E1EDK01> 
    <E1EDKA1 SEGMENT="1"> 
    <PARVW>AG</PARVW> 
    <LIFNR>B15</LIFNR> 
    <TELF1></TELF1> 
    <BNAME></BNAME> 
    </E1EDKA1> 
    <E1EDKA1 SEGMENT="1"> 
    <PARVW>WE</PARVW> 
    <LIFNR>B15</LIFNR> 
    </E1EDKA1> 
    <E1EDKA1 SEGMENT="1"> 
    <PARVW>LF</PARVW> 
    </E1EDKA1> 
    <E1EDK02 SEGMENT="1"> 
    <QUALF>001</QUALF> 
    <BELNR>4505345253</BELNR> 
    <DATUM>20121102T00:00:00</DATUM> 
    <UZEIT>20121102T00:00:00</UZEIT> 
    </E1EDK02> 
    <E1EDP01 SEGMENT="1"> 
    <POSEX>00001</POSEX> 
    <MENGE>1</MENGE> 
    <MENEE>EA</MENEE> 
    <VPREI>150.00</VPREI> 
    <NETWR></NETWR> 
    <CURCY>ZAR</CURCY> 
    <E1EDP19 SEGMENT="1"> 
    <QUALF>001</QUALF> 
    <IDTNR>145416</IDTNR> 
    </E1EDP19> 
    <E1EDPT1 SEGMENT="1"> 
    <TDID>ZERR</TDID> 
    <TSSPRAS_ISO>EN</TSSPRAS_ISO> 
    <E1EDPT2 SEGMENT="1"> 
    <TDLINE>Description: GAS CYL DBL NOZZLE 48KG EM</TDLINE> 
    <TDFORMAT>*</TDFORMAT> 
    </E1EDPT2> 
    <E1EDPT2 SEGMENT="1"> 
    <TDLINE>UOM: EA</TDLINE> 
    <TDFORMAT>*</TDFORMAT> 
    </E1EDPT2> 
    <E1EDPT2 SEGMENT="1"> 
    <TDLINE>Quantity: 1</TDLINE> 
    <TDFORMAT>*</TDFORMAT> 
    </E1EDPT2> 
    <E1EDPT2 SEGMENT="1"> 
    <TDLINE>Unit Price: 150</TDLINE> 
    <TDFORMAT>*</TDFORMAT> 
    </E1EDPT2> 
    <E1EDPT2 SEGMENT="1"> 
    <TDLINE>Customer Part Number: 145416</TDLINE> 
    <TDFORMAT>*</TDFORMAT> 
    </E1EDPT2></E1EDPT1> 
    </E1EDP01> 
    <E1EDP01 SEGMENT="1"> 
    <POSEX>00002</POSEX> 
    <MENGE>1</MENGE> 
    <MENEE>EA</MENEE> 
    <VPREI>150.00</VPREI> 
    <NETWR></NETWR> 
    <CURCY>ZAR</CURCY> 
    <E1EDP19 SEGMENT="1"> 
    <QUALF>001</QUALF> 
    <IDTNR>407303</IDTNR> 
    </E1EDP19> 
    <E1EDPT1 SEGMENT="1"> 
    <TDID>ZERR</TDID> 
    <TSSPRAS_ISO>EN</TSSPRAS_ISO> 
    <E1EDPT2 SEGMENT="1"> 
    <TDLINE>Description: GAS CYL DBL NOZZLE 48KG EM</TDLINE> 
    <TDFORMAT>*</TDFORMAT> 
    </E1EDPT2> 
    <E1EDPT2 SEGMENT="1"> 
    <TDLINE>UOM: EA</TDLINE> 
    <TDFORMAT>*</TDFORMAT> 
    </E1EDPT2> 
    <E1EDPT2 SEGMENT="1"> 
    <TDLINE>Quantity: 1</TDLINE> 
    <TDFORMAT>*</TDFORMAT> 
    </E1EDPT2> 
    <E1EDPT2 SEGMENT="1"> 
    <TDLINE>Unit Price: 150</TDLINE> 
    <TDFORMAT>*</TDFORMAT> 
    </E1EDPT2> 
    <E1EDPT2 SEGMENT="1"> 
    <TDLINE>Customer Part Number: 407303</TDLINE> 
    <TDFORMAT>*</TDFORMAT> 
    </E1EDPT2></E1EDPT1> 
    </E1EDP01> 
    <E1EDS01 SEGMENT="1"> 
    <SUMID>001</SUMID> 
    <SUMME>1</SUMME> 
    </E1EDS01> 
    <E1EDS01 SEGMENT="1"> 
    <SUMME>150.00</SUMME> 
    <WAERQ>ZAR</WAERQ> 
    </E1EDS01> 
</IDOC> 

這個例子將刪除第二行,因爲這不包含由XSLT被移除以及一個項目。它應該只處理第一行。

<?xml version="1.0" encoding="UTF-8"?> 
    <ORDERS05> 
<IDOC BEGIN="1"> 
    <EDI_DC40 SEGMENT="1"> 
    <TABNAM>EDI_DC40</TABNAM> 
    <DIRECT>2</DIRECT> 
    <IDOCTYP>ORDERS05</IDOCTYP> 
    <MESTYP>ORDERS</MESTYP> 
    <SNDPOR>SNDPOR</SNDPOR> 
    <SNDPRT>KU</SNDPRT> 
    <SNDPFC>AG</SNDPFC> 
    <SNDPRN>BWH</SNDPRN> 
    <RCVPOR>RCVPOR</RCVPOR> 
    <RCVPFC>LS</RCVPFC> 
    <RCVPRN>RCVPRN</RCVPRN> 
    </EDI_DC40> 
    <E1EDK01 SEGMENT="1"> 
    <BSART>UB</BSART> 
    <BELNR>4504836702</BELNR> 
    </E1EDK01> 
    <E1EDKA1 SEGMENT="1"> 
    <PARVW>AG</PARVW> 
    <LIFNR>1001600-S78</LIFNR> 
    <TELF1></TELF1> 
    <BNAME></BNAME> 
    </E1EDKA1> 
    <E1EDKA1 SEGMENT="1"> 
    <PARVW>WE</PARVW> 
    <LIFNR>1001600-S78</LIFNR> 
    </E1EDKA1> 
    <E1EDKA1 SEGMENT="1"> 
    <PARVW>LF</PARVW> 
    </E1EDKA1> 
    <E1EDK02 SEGMENT="1"> 
    <QUALF>001</QUALF> 
    <BELNR>4504836702</BELNR> 
    <DATUM>20120423T00:00:00</DATUM> 
    <UZEIT>20120423T00:00:00</UZEIT> 
    </E1EDK02> 
    <E1EDP01 SEGMENT="1"> 
    <POSEX>00001</POSEX> 
    <MENGE>100</MENGE> 
    <MENEE>EA</MENEE> 
    <VPREI>156.18</VPREI> 
    <NETWR></NETWR> 
    <CURCY>ZAR</CURCY> 
    <E1EDP19 SEGMENT="1"> 
    <QUALF>001</QUALF> 
    <IDTNR>10220</IDTNR> 
    </E1EDP19> 
    <E1EDPT1 SEGMENT="1"> 
    <TDID>ZERR</TDID> 
    <TSSPRAS_ISO>EN</TSSPRAS_ISO> 
    <E1EDPT2 SEGMENT="1"> 
    <TDLINE>Description: GAS 9KG</TDLINE> 
    <TDFORMAT>*</TDFORMAT> 
    </E1EDPT2> 
    <E1EDPT2 SEGMENT="1"> 
    <TDLINE>UOM: EA</TDLINE> 
    <TDFORMAT>*</TDFORMAT> 
    </E1EDPT2> 
    <E1EDPT2 SEGMENT="1"> 
    <TDLINE>Quantity: 100</TDLINE> 
    <TDFORMAT>*</TDFORMAT> 
    </E1EDPT2> 
    <E1EDPT2 SEGMENT="1"> 
    <TDLINE>Unit Price: 156.18</TDLINE> 
    <TDFORMAT>*</TDFORMAT> 
    </E1EDPT2> 
    <E1EDPT2 SEGMENT="1"> 
    <TDLINE>Customer Part Number: 10220</TDLINE> 
    <TDFORMAT>*</TDFORMAT> 
    </E1EDPT2> 
    </E1EDPT1> 
    </E1EDP01> 
    <E1EDP01 SEGMENT="1"> 
    <POSEX>00002</POSEX> 
    <MENGE>1</MENGE> 
    <MENEE>EA</MENEE> 
    <VPREI>150.00</VPREI> 
    <NETWR></NETWR> 
    <CURCY>ZAR</CURCY> 
    <E1EDP19 SEGMENT="1"> 
    <QUALF>001</QUALF> 
    <IDTNR>243</IDTNR> 
    </E1EDP19> 
    <E1EDPT1 SEGMENT="1"> 
    <TDID>ZERR</TDID> 
    <TSSPRAS_ISO>EN</TSSPRAS_ISO> 
    <E1EDPT2 SEGMENT="1"> 
    <TDLINE>Description: GAS EMPTY 9 KG</TDLINE> 
    <TDFORMAT>*</TDFORMAT> 
    </E1EDPT2> 
    <E1EDPT2 SEGMENT="1"> 
    <TDLINE>UOM: EA</TDLINE> 
    <TDFORMAT>*</TDFORMAT> 
    </E1EDPT2> 
    <E1EDPT2 SEGMENT="1"> 
    <TDLINE>Quantity: 1</TDLINE> 
    <TDFORMAT>*</TDFORMAT> 
    </E1EDPT2> 
    <E1EDPT2 SEGMENT="1"> 
    <TDLINE>Unit Price: 150</TDLINE> 
    <TDFORMAT>*</TDFORMAT> 
    </E1EDPT2> 
    <E1EDPT2 SEGMENT="1"> 
    <TDLINE>Customer Part Number: 243</TDLINE> 
    <TDFORMAT>*</TDFORMAT> 
    </E1EDPT2> 
    </E1EDPT1> 
    </E1EDP01> 
    <E1EDS01 SEGMENT="1"> 
    <SUMID>001</SUMID> 
    <SUMME>2</SUMME> 
    </E1EDS01> 
    <E1EDS01 SEGMENT="1"> 
    <SUMME>30618.00</SUMME> 
    <WAERQ>ZAR</WAERQ> 
    </E1EDS01> 
</IDOC> 
    </ORDERS05> 
+1

一些示例輸入XML和所需的輸出將有所幫助... –

回答

0

您可以通過雙重否定(您想直接複製根目錄只有沒有不在您材料列表中的元素)來實現您的結果。

這裏有一個示例轉換。

順便說一句:我利用「地圖」變量來簡化驗證,就像this後的建議。如果你使用的是XSLT 2.0,你可以按照同一篇文章的想法簡化它(直接使用變量,而不是使用document(''))。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:mat="materials" exclude-result-prefixes="mat"> 
    <xsl:output method="xml" indent="yes"/> 
    <mat:materials> 
     <IDTNR>407303</IDTNR> 
     <IDTNR>243</IDTNR> 
     <IDTNR>262</IDTNR> 
     <IDTNR>265</IDTNR> 
     <IDTNR>5624</IDTNR> 
     <IDTNR>145416</IDTNR> 
    </mat:materials> 
    <xsl:variable name="materials" select="document('')/*/mat:materials/IDTNR"/> 
    <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> 
    <xsl:template match="node()"> 
     <xsl:copy> 
      <xsl:copy-of select="@*"/> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 
    <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> 
    <xsl:template match="E1EDP01[E1EDP19/IDTNR = $materials]"/> 
    <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> 
    <xsl:template match="ORDERS05[not(IDOC/E1EDP01/E1EDP19[not(IDTNR=$materials)])]"> 
     <xsl:copy-of select="."/> 
    </xsl:template> 
</xsl:stylesheet> 

我希望這有助於!

Carles

+0

Carles。非常感謝你做的這些。在我的測試中工作就像一個魅力。要適應以符合我在運行時檢查有問題的段的要求。將更新... – user1801034