Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查来自不同父级的XML值并替换值_Xml_Xslt_Xslt 1.0 - Fatal编程技术网

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

检查来自不同父级的XML值并替换值,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,我有一个情况,我需要一些点击来发展它: XML很大,我将仅包括以下部分: <root> <header></header> <EventList> <ObjectEvent> <epcList /> <biz>AAA</biz> <extension> &

我有一个情况,我需要一些点击来发展它:

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>
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>
在这种情况下,parend id为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上,但不在此位置:

感谢

由于extension和SAPExtension元素的值仅针对具有子元素biz='AAA'值的ObjectEvent复制到匹配的聚合/parentID,因此需要按如下方式更改模板

<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>
完整的XSLT如下所示

<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>
在共享输入XML中,epc值1和2都与相应的parentID匹配,因此节点被适当地复制


请在

中找到工作示例,是否希望向条件适用的ObjectEvent元素添加新的disposition元素?还是要将处置添加到其他位置?由于结果片段以及您链接到的图像都包含输入示例中根本不出现的各种元素,因此很难理解问题所在。您应该将示例减少到最少,但要完整且格式良好,以演示您需要帮助的问题,然后我们可以帮助解决这个问题。然后,您就可以将修复程序合并到更大的样式表中,或者使用更大、更复杂的XML输入。因此,尝试通过发布一个最小但完整且格式良好的XML输入和XSLT以及您得到的输出和您想要的输出来隔离当前的问题,然后我们可以帮助解决这个问题。Martin,感谢您的支持,我已经解决了XML和需求,我在这里编码,但现在缺少了一点。感谢我测试的代码,但是需求更改-使用聚合事件父ID并查找biz=AAA事件,其epcList/epc包括parentID Get all fields ObjectEvent\Extension\和ObjectEvent\sapension\的parentID请更新示例输入XML和相应的输出让需求更清楚地理解。Aniket,我只是用一个文件样本编辑您的回复,以及必须做的事情。感谢您的耐心和时间。我已经移动了更新的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>