我想根据某些条件输出一个 xml。
这是我的输入 XML
<YIORDER01>
<IDOC>
<E1ORHDR>
<E1OROPR>
<VORNR>0010</VORNR>
<E1OROPR_MAT>
<MATNR>M0003-01</MATNR>
<YE1OROPR_MAT>
<STTXT>REL</STTXT>
<MTART>ZPAR</MTART>
<POSTP>L</POSTP>
</YE1OROPR_MAT>
</E1OROPR_MAT>
<E1OROPR_MAT>
<MATNR>M0003-01</MATNR>
<YE1OROPR_MAT>
<STTXT>REL</STTXT>
<MTART>XYZ</MTART>
<POSTP>M</POSTP>
</YE1OROPR_MAT>
</E1OROPR_MAT>
</E1OROPR>
<E1OROPR>
<VORNR>0020</VORNR>
<E1OROPR_MAT>
<MATNR>M0003-01</MATNR>
<YE1OROPR_MAT>
<STTXT>REL</STTXT>
<MTART>ZPAR</MTART>
<POSTP>L</POSTP>
</YE1OROPR_MAT>
</E1OROPR_MAT>
</E1OROPR>
</E1ORHDR>
</IDOC>
</YIORDER01>
输出是这样的。
<PartOrderList>
<PartOrder>
<OperationBONumber>0010</OperationBONumber>
<PartOrderLine>
<MaterialNumber>M0003-01</MaterialNumber>
<ShipmentType>REL</ShipmentType>
</PartOrderLine>
</PartOrder>
<PartOrder>
<OperationBONumber>0020</OperationBONumber>
</PartOrder>
</PartOrderList>
我的 XSLT 就是这个
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="YIORDER01">
<xsl:element name="PartOrderList">
<xsl:for-each select="IDOC/E1ORHDR/E1OROPR">
<xsl:element name="PartOrder">
<xsl:element name="OperationBONumber">
<xsl:value-of select="VORNR"/>
</xsl:element>
<xsl:for-each select="E1OROPR_MAT">
<xsl:if test="YE1OROPR_MAT/MTART = 'ZPAR' and YE1OROPR_MAT/POSTP = 'L'">
<xsl:element name="PartOrderLine">
<xsl:element name="MaterialNumber">
<xsl:value-of select="MATNR"/>
</xsl:element>
<xsl:element name="ShipmentType">
<xsl:value-of select="YE1OROPR_MAT/STTXT"/>
</xsl:element>
</xsl:element>
</xsl:if>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
这里的问题是,我不希望输出中出现第二个“PartOrder”标签,因为它没有任何“PartOrderLine”子标签。
xslt 中使用的规则:
- 为输入中的每个“E1OROPR”在输出中创建一个“PartOrder”标签
- 仅当“MTART”=“ZPAR”和“POSTP”=“L”时在“PartOrder”内创建“PartOrderLine”标签
- 如果输出中没有有效的“PartOrderLine”标签,请勿创建任何“PartOrder”标签。
使用我的 xslt 我能够实现规则 1 和 2,但不知道如何实现规则 3。
有什么方法可以使用 xslt 实现这一点?
请帮忙。