xml - 如何根据重复子段的过滤器忽略整个 xml 内容

标签 xml xpath xslt-2.0 predicate

当单个 ROW 标记中存在包含 MATERIALSTATUS = Z7 和 SALESORG = 1207 的 Group_2 段时,我需要忽略整个 XML 内容。

下面给出了我的输入 xml。

<?xml version="1.0" encoding="UTF-8"?>
<RESULTS>
   <Groups>
      <Group_1>
         <RESULTSET_1>
            <ROW>
               <MATERIAL>12345</MATERIAL>
               <HARMCODE>3304.91.0000</HARMCODE>
               <ARTICLETYPE>005</ARTICLETYPE>
               <ARTICLESUBTYPE>014</ARTICLESUBTYPE>
               <MATCATGROUP/>
               <AUGROCERYPRODUCT/>
            </ROW>
         </RESULTSET_1>
      </Group_1>
      <Group_2>
         <RESULTSET_1>
            <ROW>
               <MATERIAL>12345</MATERIAL>
               <SALESORG>1119</SALESORG>
               <MATERIALSTATUS>Z7</MATERIALSTATUS>
            </ROW>
            <ROW>
               <MATERIAL>12345</MATERIAL>
               <SALESORG>1207</SALESORG>
               <MATERIALSTATUS>D4</MATERIALSTATUS>
            </ROW>
            <ROW>
               <MATERIAL>12345</MATERIAL>
               <SALESORG>1207</SALESORG>
               <MATERIALSTATUS>Z7</MATERIALSTATUS>
            </ROW>
         </RESULTSET_1>
      </Group_2>
   </Groups>
</RESULTS>

由于此 xml 在单个(第三个)ROW 标记中包含具有 MATERIALSTATUS = Z7 和 SALESORG = 1207 的 Group_2 段,因此我所需的输出应如下所示:

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

我的 XSLT 代码如下:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes" encoding="UTF-8"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="/">
        <RESULTS>
            <xsl:for-each-group select="/RESULTS/Groups/*" group-by="*/ROW/MATERIAL">
                <Groups>
                    <xsl:choose>
                        <xsl:when test="(../Group_2/RESULTSET_1/ROW[MATERIALSTATUS = 'Z7'])">
                            <xsl:choose>
                                <xsl:when test="(../Group_2/RESULTSET_1/ROW[SALESORG = '1207'])">
                                </xsl:when>
                                <xsl:otherwise>
                                    <xsl:copy-of select="current-group()"/>
                                </xsl:otherwise>
                            </xsl:choose>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:copy-of select="current-group()"/>
                        </xsl:otherwise>
                    </xsl:choose>
                </Groups>
            </xsl:for-each-group>
        </RESULTS>
    </xsl:template>
</xsl:stylesheet>

此 XSL 适用于给定的 XML 输入。但是,当我将 SALESORG 设置为 1207(在一个 ROW 段中)并将 MATERIALSTATUS 设置为 Z7(在另一个 ROW 段中)时,我不希望输出被抑制。但我的 XSL 通过在所有 3 个标记中查找 1207 来抑制整个 xml。

请帮助我了解我可以做些什么来实现这一目标?谢谢。

最佳答案

我认为你可以只检查current-group()是否包含这样的ROW,然后不复制任何内容:

<xsl:template match="/">
    <RESULTS>
        <xsl:for-each-group select="/RESULTS/Groups/*" group-by="*/ROW/MATERIAL">
            <Groups>
                <xsl:copy-of
                  select="if (current-group()[self::Group_2/RESULTSET_1/ROW[MATERIALSTATUS = 'Z7' and SALESORG = 1207]])
                          then () else current-group()"/>
            </Groups>
        </xsl:for-each-group>
    </RESULTS>
</xsl:template>

https://xsltfiddle.liberty-development.net/6qVRKwF

也可以写成

<xsl:template match="/">
    <RESULTS>
        <xsl:for-each-group select="/RESULTS/Groups/*" group-by="*/ROW/MATERIAL">
            <Groups>
                <xsl:copy-of
                  select="current-group()[not(some $row in current-group()[self::Group_2]/RESULTSET_1/ROW satisfies $row/MATERIALSTATUS = 'Z7' and $row/SALESORG = 1207)]"/>
            </Groups>
        </xsl:for-each-group>
    </RESULTS>
</xsl:template>

https://xsltfiddle.liberty-development.net/6qVRKwF/1或者当然使用类似的xsl:choose

关于xml - 如何根据重复子段的过滤器忽略整个 xml 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52295351/

相关文章:

android - AlignParentBottom 按钮与 Scroll/Focus 上的 Textview 重叠

java - 从线程获取资源

xml - 匹配具有特定祖先Xpath Xslt的节点

Java:XPath获取同一路径的元素计数

xml - 通过 XSLT 转换 XML 文件将数字转换为罗马数字

xslt-2.0 - 为什么 index-of() 在应用于一系列唯一节点时会返回多个值?

Python:展平 XML 文档(删除换行符)

xml - 使用 Powershell 进行外科 XML 编辑

xslt - 匹配XPath产生错误,加载样式表:解析XSLT样式表失败

xslt - 在XSLT中按范围限制输出