ある条件で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>
ここでの問題は、「PartOrderLine」の子がないため、出力に 2 番目の「PartOrder」タグが必要ないことです。
xslt で使用されるルール:
- 入力の「E1OROPR」ごとに、出力に「PartOrder」タグを作成します
- "MTART" = "ZPAR" および "POSTP" = "L" の場合にのみ、"PartOrder" 内に "PartOrderLine" タグを作成します。
- 出力に有効な「PartOrderLine」タグがない場合は、「PartOrder」タグを作成しないでください。
xslt を使用すると、ルール 1 と 2 を達成できますが、ルール 3 を達成する方法がわかりません
。xslt を使用してこれを達成する方法はありますか??
助けてください。