Вы можете использовать этот XSLT-1.0, который выполняет замену всех соответствующих узлов, если они присутствуют. Он избирательно восстанавливает структуру элемента AWARDLINE
и работает в сочетании с шаблоном идентификации .
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- identity template -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<!-- reconstruction of the AWARDLINE element structure -->
<xsl:template match="AWARDLINE">
<xsl:copy>
<xsl:copy-of select="*[not(self::SHIPMENT)]" />
<SHIPMENT>
<xsl:copy-of select="SHIPMENT/*[not(self::ACCOUNT)]" />
<ACCOUNT>
<xsl:copy-of select="SHIPMENT/ACCOUNT/*[not(self::ASSOCIATEDREQ)]" />
<ASSOCIATEDREQ>
<xsl:copy-of select="SHIPMENT/ACCOUNT/ASSOCIATEDREQ/*" />
</ASSOCIATEDREQ>
</ACCOUNT>
</SHIPMENT>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Другая возможность - использование шаблонов. Это может обработать более одного SHIPMENT
элемента и создать пустую структуру, если другие элементы отсутствуют.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- identity template -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<!-- reconstruction of the AWARDLINE element structure -->
<xsl:template match="AWARDLINE">
<xsl:copy>
<xsl:copy-of select="*[not(self::SHIPMENT)]|@*" />
<xsl:apply-templates select="SHIPMENT" />
</xsl:copy>
</xsl:template>
<xsl:template match="AWARDLINE[not(SHIPMENT)]">
<xsl:copy>
<xsl:copy-of select="*|@*" />
<SHIPMENT>
<ACCOUNT>
<ASSOCIATEDREQ />
</ACCOUNT>
</SHIPMENT>
</xsl:copy>
</xsl:template>
<xsl:template match="SHIPMENT">
<xsl:copy>
<xsl:copy-of select="*[not(self::ACCOUNT)]|@*" />
<xsl:apply-templates select="ACCOUNT" />
</xsl:copy>
</xsl:template>
<xsl:template match="SHIPMENT[not(ACCOUNT)]">
<xsl:copy>
<xsl:copy-of select="*|@*" />
<ACCOUNT>
<ASSOCIATEDREQ />
</ACCOUNT>
</xsl:copy>
</xsl:template>
<xsl:template match="ACCOUNT">
<xsl:copy>
<xsl:copy-of select="*[not(self::ASSOCIATEDREQ)]|@*" />
<xsl:apply-templates select="ASSOCIATEDREQ" />
</xsl:copy>
</xsl:template>
<xsl:template match="ACCOUNT[not(ASSOCIATEDREQ)]">
<xsl:copy>
<xsl:copy-of select="*|@*" />
<ASSOCIATEDREQ />
</xsl:copy>
</xsl:template>
<xsl:template match="ASSOCIATEDREQ">
<xsl:copy>
<xsl:copy-of select="*|@*" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>