如果仅存在指定值,则绕过XSLT转换

时间:2012-11-05 18:49:19

标签: xslt

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

但是我们还要检查目标消息是否只包含(仅限),这些材料然后转换不应该删除这些材料。

目前,以下代码是查找和删除相关资料。请建议如何忽略此新要求的转换。

我在考虑选择 - > 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 个答案:

答案 0 :(得分:0)

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

这里有一个示例转换。

BTW:我使用了“map”变量来简化验证,就像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>

我希望这有帮助!

卡尔斯