0

各位专家晚上好。我的要求如下。我正在根据不应传递的材料转换目标消息。如果目标消息包含某些材料,则这些材料将从目标中删除。

但是,我们还要检查目标消息是否只包含(ONLY)这些材料,那么转换根本不应该删除这些材料。

目前下面的代码是查找和删除有问题的材料。请建议如何忽略此新要求的转换。

我正在考虑选择->何时->其他情况。

提前谢谢了。

<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>

此示例将删除第 2 行,因为其中包含一个不会被 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>
4

1 回答 1

0

您可以通过双重否定来实现您的结果(您想直接复制根目录,只有没有不在您的材料列表中的元素)。

在这里,您有一个示例转换。

顺便说一句:我使用“map”变量来简化验证,就像这篇文章中建议的那样。如果您使用的是 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>

我希望这有帮助!

卡尔斯

于 2012-11-06T15:57:52.110 回答