我有一个情况,需要一些帮助来解决它:
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='urn:epcglobal:cbv:bizstep:commissioning'">
<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的处理方式却不在此位置:
谢谢
答案 0 :(得分:1)
由于extension
和SAPExtension
元素的值仅对于具有子元素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>
值epc
和1
都与相应的2
匹配,因此节点被适当地复制了。