xslt - XPATH:for-each中的多个否定

标签 xslt xpath foreach

我有以下简化的XML:

<?xml version="1.0" encoding="UTF-8" ?>
<MATMAS05>
<IDOC BEGIN="1">
    <E1MARAM SEGMENT="1">
        <MSGFN>005</MSGFN>
        <MATNR>000000000000401436</MATNR>
        <E1MARCM SEGMENT="1">
            <MSGFN>005</MSGFN>
            <WERKS>A120</WERKS>
            <MMSTA>01</MMSTA>
        </E1MARCM>
        <E1MVKEM SEGMENT="1">
            <VKORG>0120</VKORG>
            <VMSTA>04</VMSTA>
        </E1MVKEM>
    </E1MARAM>
</IDOC>
</MATMAS05>


如果<WERKS>=A120<MMSTA> is NOT '01' or '02' or '03'<VKORG>=0120<VMSTA> is NOT '01' or '02' or '03',则<MATNR>应该映射到目标XML。

我想出了以下XSLT:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output encoding="UTF-8" method="xml" indent="yes"/>

<xsl:template match="/*">
    <xsl:for-each
        select="IDOC[(E1MARAM/E1MVKEM[VKORG='0120'][not(VMSTA='01' or VMSTA='02' or VMSTA='03')])
            or (E1MARAM/E1MARCM[WERKS = 'A120'][not(MMSTA='01' or MMSTA='02' or MMSTA='03')])]">
        <Item>
            <ITEM_CODE>
                <xsl:value-of select="E1MARAM/MATNR"/>
            </ITEM_CODE>
        </Item>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>


但是,如果我应用该XSLT,则会得到以下不需要的输出(因为<MMSTA>='01'):

<?xml version="1.0" encoding="UTF-8"?>
<Item>
<ITEM_CODE>000000000000401436</ITEM_CODE>
</Item>


我该如何解决?我已经尝试过使用该XPATH表达式,但是无法获得想要的结果。 XPATH我在做什么错?

谢谢你的任何想法。
最好的祝福,
彼得

最佳答案

这是我所做的:

//IDOC[(E1MARAM/E1MVKEM[VKORG='0120' and not(VMSTA='01' or VMSTA='02' or VMSTA='03')]) or (E1MARAM/E1MARCM[WERKS='A120' and not(MMSTA='01' or MMSTA='02' or MMSTA='03')])]


我也尝试了您的方法,并且如果您将根添加到IDOC中也可以使用,因为MATMAS05是实际的根:

//IDOC[(E1MARAM/E1MVKEM[VKORG='0120'][not(VMSTA='01' or VMSTA='02' or VMSTA='03')])             or (E1MARAM/E1MARCM[WERKS = 'A120'][not(MMSTA='01' or MMSTA='02' or MMSTA='03')])]

关于xslt - XPATH:for-each中的多个否定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9802783/

相关文章:

xml - emacs xpath xml xslt

xpath - 在短语中选择日期的正确 Xpath 子字符串是什么?

java - Selenium 按钮不是 WebElement

javascript - 列出来自Youtube channel 的最新视频,代码可以运行,但是Youtube Data API的每日配额过快填满了吗?

c# - 如何遍历复杂类型对象列表并传递给调用 SQL 存储过程的方法

java - XPATH:选择 xml 文件的子集

xslt 2.0 如何舍入数字? 1.45632 => 1.46

xml - 如何嵌套xsl :for-each selec

xpath - 如何在 xpath 中将 not() 与 'and' 结合使用

javascript - Meteor forEach() 无法解释地改变传递的变量