#xml #loops #xslt #edi
Вопрос:
В моем XSLT я проверяю WorkFlow/@name = 'UNS_SMTP_SERVICES'
, не правда ли, что я хочу удалить Document
, и если ни одно из них не Document
имеет значения, которое я хочу удалить Partner
. Я мог бы достичь этого в какой-то степени, но не смог получить желаемый результат.
Мой вклад:
<?xml version="1.0" encoding="UTF-8"?>
<Partners>
<Partner name="VACMCLEA">
<LastUpdate>
<Status>ACTIVE</Status>
</LastUpdate>
<Documents>
<Document name="SNDMANASN">
<LastUpdate>
<Status>ACTIVE</Status>
</LastUpdate>
<BusinessProcess name="">
<WorkFlow name="UNS_FILESYSTEM_ARCHIVE">
<Parm>ArchiveInfo/FileName=vacmclea_sndmanasnamp;amp;ArchiveInfo/Dir=/edi/archive/vacmclea</Parm>
<LastUpdate>
<Status>ACTIVE</Status>
</LastUpdate>
</WorkFlow>
</BusinessProcess>
</Document>
<Document name="855E">
<LastUpdate>
<Status>ACTIVE</Status>
</LastUpdate>
<BusinessProcess name="">
<WorkFlow name="UNS_SMTP_SERVICES">
<Parm>xport-smtp-mailto=itdi@uco.com,amp;amp;xport-smtp-mailfrom=IS-PD@uco.comamp;amp;xport-smtp-mailhost=ma.uco.comamp;amp;xport-smtp-mailport=25amp;amp;b2b-raw-message=trueamp;amp;xport-smtp-mailsubject=Needs Attention</Parm>
<LastUpdate>
<Status>ACTIVE</Status>
</LastUpdate>
</WorkFlow>
</BusinessProcess>
</Document>
</Documents>
</Partner>
<Partner name="ABC">
<LastUpdate>
<Status>ACTIVE</Status>
</LastUpdate>
<Documents>
<Document name="SNDMANASN">
<LastUpdate>
<Status>ACTIVE</Status>
</LastUpdate>
<BusinessProcess name="">
<WorkFlow name="UNS_FILESYSTEM_ARCHIVE">
<Parm>ArchiveInfo/FileName=abc_sndmanasnamp;amp;ArchiveInfo/Dir=/edi/archive/abc</Parm>
<LastUpdate>
<Status>ACTIVE</Status>
</LastUpdate>
</WorkFlow>
</BusinessProcess>
</Document>
</Documents>
</Partner>
<Partner name="CISCO">
<LastUpdate>
<Status>ACTIVE</Status>
</LastUpdate>
<Documents>
<Document name="SNDMANASN">
<LastUpdate>
<Status>ACTIVE</Status>
</LastUpdate>
<BusinessProcess name="">
<WorkFlow name="UNS_SMTP_SERVICES">
<Parm>ArchiveInfo/FileName=cisco_sndmanasnamp;amp;ArchiveInfo/Dir=/edi/archive/cisco</Parm>
<LastUpdate>
<Status>ACTIVE</Status>
</LastUpdate>
</WorkFlow>
</BusinessProcess>
</Document>
<Document name="856">
<LastUpdate>
<Status>ACTIVE</Status>
</LastUpdate>
<BusinessProcess name="">
<WorkFlow name="UNS_SMTP_SERVICES">
<Parm>xport-smtp-mailto=itdi@uco.com,amp;amp;xport-smtp-mailfrom=IS-PD@uco.comamp;amp;xport-smtp-mailhost=ma.uco.comamp;amp;xport-smtp-mailport=25amp;amp;b2b-raw-message=trueamp;amp;xport-smtp-mailsubject=Needs Attention</Parm>
<LastUpdate>
<Status>ACTIVE</Status>
</LastUpdate>
</WorkFlow>
</BusinessProcess>
</Document>
</Documents>
</Partner>
</Partners>
Мой XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!-- <xsl:strip-space elements="*"/> -->
<xsl:output method="xml" indent="yes" media-type="text/xml" omit-xml-declaration="no" encoding="utf-8"/>
<xsl:param name="lineDelimiter" select="'amp;#10;'"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Partner[not(.//WorkFlow[not(@name!='UNS_SMTP_SERVICES')])]" />
</xsl:stylesheet>
Мой вывод: Мой XSLT не удаляется Document/@name ='SNDMANASN'
из Partner/@name = 'VACMCLEA'
.
<?xml version="1.0" encoding="utf-8"?>
<Partners>
<Partner name="VACMCLEA">
<LastUpdate>
<Status>ACTIVE</Status>
</LastUpdate>
<Documents>
<Document name="SNDMANASN">
<LastUpdate>
<Status>ACTIVE</Status>
</LastUpdate>
<BusinessProcess name="">
<WorkFlow name="UNS_FILESYSTEM_ARCHIVE">
<Parm>ArchiveInfo/FileName=vacmclea_sndmanasnamp;amp;ArchiveInfo/Dir=/edi/archive/vacmclea</Parm>
<LastUpdate>
<Status>ACTIVE</Status>
</LastUpdate>
</WorkFlow>
</BusinessProcess>
</Document>
<Document name="855E">
<LastUpdate>
<Status>ACTIVE</Status>
</LastUpdate>
<BusinessProcess name="">
<WorkFlow name="UNS_SMTP_SERVICES">
<Parm>xport-smtp-mailto=itdi@uco.com,amp;amp;xport-smtp-mailfrom=IS-PD@uco.comamp;amp;xport-smtp-mailhost=ma.uco.comamp;amp;xport-smtp-mailport=25amp;amp;b2b-raw-message=trueamp;amp;xport-smtp-mailsubject=Needs Attention</Parm>
<LastUpdate>
<Status>ACTIVE</Status>
</LastUpdate>
</WorkFlow>
</BusinessProcess>
</Document>
</Documents>
</Partner>
<Partner name="CISCO">
<LastUpdate>
<Status>ACTIVE</Status>
</LastUpdate>
<Documents>
<Document name="SNDMANASN">
<LastUpdate>
<Status>ACTIVE</Status>
</LastUpdate>
<BusinessProcess name="">
<WorkFlow name="UNS_SMTP_SERVICES">
<Parm>ArchiveInfo/FileName=cisco_sndmanasnamp;amp;ArchiveInfo/Dir=/edi/archive/cisco</Parm>
<LastUpdate>
<Status>ACTIVE</Status>
</LastUpdate>
</WorkFlow>
</BusinessProcess>
</Document>
<Document name="856">
<LastUpdate>
<Status>ACTIVE</Status>
</LastUpdate>
<BusinessProcess name="">
<WorkFlow name="UNS_SMTP_SERVICES">
<Parm>xport-smtp-mailto=itdi@uco.com,amp;amp;xport-smtp-mailfrom=IS-PD@uco.comamp;amp;xport-smtp-mailhost=ma.uco.comamp;amp;xport-smtp-mailport=25amp;amp;b2b-raw-message=trueamp;amp;xport-smtp-mailsubject=Needs Attention</Parm>
<LastUpdate>
<Status>ACTIVE</Status>
</LastUpdate>
</WorkFlow>
</BusinessProcess>
</Document>
</Documents>
</Partner>
</Partners>
Ответ №1:
Вы можете использовать эти два пустых шаблона:
<xsl:template match="Document[not(BusinessProcess/WorkFlow[@name='UNS_SMTP_SERVICES'])]" />
<xsl:template match="Partner[not(Documents/Document/BusinessProcess/WorkFlow[@name='UNS_SMTP_SERVICES'])]" />
Первый удаляет соответствующие Document
узлы, а второй partner
-те, которые есть.