【发布时间】:2018-08-18 17:09:20
【问题描述】:
我有一个情况,我需要一些点击来开发它:
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 上的一个元素的值更改为布尔值 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 从标签中选择值并添加到相对 parentID 的 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 的这种处置但不在此位置:
谢谢
【问题讨论】:
-
所以您想向满足条件的
ObjectEvent元素添加一个新的disposition元素?或者您想在别处添加disposition?由于“结果”sn-p 以及您链接到的图像都包含输入样本中根本没有出现的各种元素,因此很难理解问题所在。 -
您应该将样本减少到最少但完整且格式良好,以证明您需要帮助的问题,然后我们可以帮助解决该特定问题。然后,您应该可以将修复合并到更大的样式表中,或者使用更大、更复杂的 XML 输入。因此,请尝试通过发布最小但完整且格式良好的 XML 输入和 XSLT 以及您获得的输出以及您想要的输出来隔离当前问题,然后我们可以帮助解决该问题。
-
Martin,感谢支持,我已经修复了 xml 和需求,我在这里编码,现在只是缺少一点。