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

  • 本文关键字:XML 替换 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 的第一个位置不同(忽略((,则检查(仅排除第一个位置(是否等于父 ID 值。如果 Yes 且 biz 等于 AAA,我需要更改/ObjectEvent/处置上一个元素的值,值为布尔值为 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 的聚合事件。

检查下面的预期结果:

对象事件\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 上的这种处置,但不在这个位置:

在此处输入图像描述

谢谢

由于extensionSAPExtension元素的值仅对具有子元素biz = 'AAA'值的ObjectEvent复制到匹配Aggregation/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 中,epc12都与相应的parentID匹配,因此节点被适当地复制。

请在 https://xsltfiddle.liberty-development.net/6qVRKwu/1 找到工作示例

相关内容

  • 没有找到相关文章

最新更新