如何根据重复子片段的过滤器忽略整个 xml 内容
How to ignore whole xml content based on filters on repeating child segments
当在单个 ROW 标记中有一个 Group_2 段且 MATERIALSTATUS = Z7 和 SALESORG = 1207 时,我需要忽略整个 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 标记中包含一个 Group_2 段,其中 MATERIALSTATUS = Z7 和 SALESORG = 1207,我想要的输出应该如下所示:
<?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
当然。
当在单个 ROW 标记中有一个 Group_2 段且 MATERIALSTATUS = Z7 和 SALESORG = 1207 时,我需要忽略整个 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 标记中包含一个 Group_2 段,其中 MATERIALSTATUS = Z7 和 SALESORG = 1207,我想要的输出应该如下所示:
<?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
当然。