检查来自不同父级的XML值并替换值

时间:2018-08-18 17:09:20

标签: xml xslt xslt-1.0

我有一个情况,需要一些帮助来解决它:

XML很大,我将仅包括一些部分:

<root>
    <header></header>
    <EventList>
        <ObjectEvent>
            <epcList />
            <biz>AAA</biz>
            <extension>
                <MATNR>1</MATNR>
                <PACK_LEVEL>1</PACK_LEVEL>
            </extension>
            <SAPExtension>
                <Attribute>
                    <LOTNO>1</LOTNO>
                </Attribute>
            </SAPExtension>
        </ObjectEvent>
        <ObjectEvent>
            <epcList>
                <epc>2</epc>
            </epcList>
            <biz>AAA</biz>
            <extension>
                <MATNR>1</MATNR>
                <PACK_LEVEL>1</PACK_LEVEL>
            </extension>
            <SAPExtension>
                <Attribute>
                    <LOTNO>1</LOTNO>
                </Attribute>
            </SAPExtension>
        </ObjectEvent>
        <ObjectEvent>
            <epcList>
                <epc>14</epc>
                <epc>11</epc>
                <epc>3</epc>
            </epcList>
            <biz>AAA</biz>
        </ObjectEvent>
        <ObjectEvent>
            <epcList>
                <epc>20</epc>
                <epc>555</epc>
                <epc>32</epc>
                <epc>1</epc>
                <epc>34</epc>
                <epc>34</epc>
                <epc>54</epc>
            </epcList>
            <biz>AAA</biz>
            <extension>
                <MATNR>1</MATNR>
                <PACK_LEVEL>1</PACK_LEVEL>
            </extension>
            <SAPExtension>
                <Attribute>
                    <LOTNO>1</LOTNO>
                </Attribute>
            </SAPExtension>
        </ObjectEvent>
        <AggregationEvent>
            <parentID>1</parentID>
            <readId/>
        </AggregationEvent>
        <AggregationEvent>
            <parentID>3</parentID>
            <readId/>
        </AggregationEvent>
        <AggregationEvent>
            <parentID>2</parentID>
            <readId/>
        </AggregationEvent>
        <AggregationEvent>
            <parentID>4</parentID>
            <readId/>
        </AggregationEvent>
    </EventList>
</root>

xml始终包含-4+ = / ObjectEvent和4 / AggregationEvent

我需要获取Aggregation/parentID的值并检查/ObjectEvent/epcList/Epc[1](仅排他性,如果xml包含相同的值,但与epc的第一个位置不同(忽略) )(如果等于parentID值)。如果是并且biz等于AAA,则需要更改/ ObjectEvent / disposition上一个元素的值为boolean true

我已经开发了一个xslt,请检查一下缺少的内容吗?

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8"
        indent="yes" />
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="ObjectEvent/epcList">
        <xsl:variable name="EPC" select="../epcList/epc[1]" />
        <xsl:for-each select="//AggregationEvent">
            <xsl:variable name="parentID" select="./parentID" />
            <xsl:if test="$parentID=$EPC">
                <xsl:for-each select="//ObjectEvent">
                    <xsl:if
                        test="./epcList/epc=$parentID and ./bizStep=&apos;urn:epcglobal:cbv:bizstep:commissioning&apos;">
                        <xsl:element name="disposition">
                            <xsl:value-of select="'true'" />
                        </xsl:element>
                    </xsl:if>
                </xsl:for-each>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

在XSLT逻辑之后预期结果:(父ID包含在epcList \ epc(位置独立)上,并且biz等于AAA从标记中选择值,然后添加相对父ID的AggregationEvent。

检查以下预期结果:

ObjectEvent \ epcList \ epc包含(2)

<ObjectEvent>
    <epcList>
        <epc>20</epc>
        <epc>12</epc>
        <epc>2</epc>
        <epc>0</epc>
    </epcList>
    <biz>AAA</biz>
    <extension>
        <MATNR>1</MATNR>
        <PACK_LEVEL>1</PACK_LEVEL>
    </extension>
    <SAPExtension>
        <Attribute>
           <LOTNO>1</LOTNO>
        </Attribute>
    </SAPExtension>
</ObjectEvent>

父项标识为2的聚合事件(在这种情况下):

<AggregationEvent>
    <parentID>1</parentID>
    <readId/>
</AggregationEvent>
<AggregationEvent>
    <parentID>3</parentID>
    <readId/>
</AggregationEvent>
<AggregationEvent>
    <parentID>2</parentID>
    <readId/>
    <extension>
                <MATNR>1</MATNR>
                <PACK_LEVEL>1</PACK_LEVEL>
            </extension>
            <SAPExtension>
                <Attribute>
                    <LOTNO>1</LOTNO>
                </Attribute>
            </SAPExtension>
</AggregationEvent>
<AggregationEvent>
    <parentID>4</parentID>
    <readId/>
</AggregationEvent>

但是这种对ObjectEvent的处理方式却不在此位置:

enter image description here

谢谢

1 个答案:

答案 0 :(得分:1)

由于extensionSAPExtension元素的值仅对于具有子元素Aggregation/parentID的{​​{1}}被复制到匹配的ObjectEvent,因此模板需要进行以下更改

biz = 'AAA'

完整的XSLT如下。

<xsl:template match="AggregationEvent">
    <xsl:copy>
        <xsl:apply-templates />
        <xsl:variable name="parentId" select="parentID" />
        <xsl:if test="../ObjectEvent[biz = 'AAA'][epcList/epc = $parentId]">
            <xsl:apply-templates select="../ObjectEvent[epcList/epc = $parentId]/extension" />
            <xsl:apply-templates select="../ObjectEvent[epcList/epc = $parentId]/SAPExtension" />
        </xsl:if>
    </xsl:copy>
</xsl:template>

在共享输入XML中,<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" /> <xsl:strip-space elements="*" /> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()" /> </xsl:copy> </xsl:template> <xsl:template match="AggregationEvent"> <xsl:copy> <xsl:apply-templates /> <xsl:variable name="parentId" select="parentID" /> <xsl:if test="../ObjectEvent[biz = 'AAA'][epcList/epc = $parentId]"> <xsl:apply-templates select="../ObjectEvent[epcList/epc = $parentId]/extension" /> <xsl:apply-templates select="../ObjectEvent[epcList/epc = $parentId]/SAPExtension" /> </xsl:if> </xsl:copy> </xsl:template> </xsl:stylesheet> epc1都与相应的2匹配,因此节点被适当地复制了。

请在https://xsltfiddle.liberty-development.net/6qVRKwu/1

中找到工作示例