应将具有 EventType != 'HardBounce' 的输入 XML 复制到输出

Posted

技术标签:

【中文标题】应将具有 EventType != \'HardBounce\' 的输入 XML 复制到输出【英文标题】:Input XML which has EventType != 'HardBounce' should be copied to output应将具有 EventType != 'HardBounce' 的输入 XML 复制到输出 【发布时间】:2021-08-30 00:43:19 【问题描述】:
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <Interaction>
        <RecipientId>666994250005</RecipientId>
        <RecipientType>Normal</RecipientType>
        <MailingId>18744460</MailingId>
        <ReportId>2121196700</ReportId>
        <CampaignId/>
        <Email>ilovepizza@mntest.net</Email>
        <EventType>HardBounce</EventType>
        <EventTimestamp>05/11/202113:46:40</EventTimestamp>
        <BodyType/>
        <ContentId/>
        <ClickName/>
        <URL/>
        <ConversionAction/>
        <ConversionDetail/>
        <ConversionAmount/>
        <SuppressionReason/>
        <MailingName>YourNovemberTrend-TESTING_682-BOUNCES</MailingName>
        <MailingSubject>YourNovemberTrend-TESTING_682-BOUNCES</MailingSubject>
        <CONTACT_MC_ID>42010A0351251EEBA0EF17B38C3EDC78</CONTACT_MC_ID>
        <CAMPAIGN_ID>0000000682</CAMPAIGN_ID>
        <SOURCE_OBJECT_ID>C01AFE8349D7F713787E25B656A3D2D6BA205205</SOURCE_OBJECT_ID>
        <UUID>ca69251e-8b0e-1d90-1700-1c42c1610f6d</UUID>
    </Interaction>
    <Interaction>
        <RecipientId>672386985145</RecipientId>
        <RecipientType>Normal</RecipientType>
        <MailingId>18848768</MailingId>
        <ReportId>2141674081</ReportId>
        <CampaignId/>
        <Email>cg@gmail.com</Email>
        <EventType>Sent</EventType>
        <EventTimestamp>06/08/202119:28:06</EventTimestamp>
        <BodyType/>
        <ContentId/>
        <ClickName/>
        <URL/>
        <ConversionAction/>
        <ConversionDetail/>
        <ConversionAmount/>
        <SuppressionReason/>
        <MailingName>TrendEmailTestSend425(18)</MailingName>
        <MailingSubject>TESTING:YourNovemberTrend-710Campaign</MailingSubject>
        <CONTACT_MC_ID>42010A0351251EDBA6904634DF983CB0</CONTACT_MC_ID>
        <CAMPAIGN_ID>0000000710</CAMPAIGN_ID>
        <SOURCE_OBJECT_ID>42948F6B87172477E4BE993B3EC48255EF4A27D4</SOURCE_OBJECT_ID>
        <UUID>1292721e-8b0e-1d90-1700-1c42c1610f6d</UUID>
    </Interaction>
</root>

我在 XSLT 下尝试,但它不起作用:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="/root/Interaction">
        <xsl:if test="/root/Interaction/EventType/text() != 'HardBounce'">
            <xsl:copy>
                <xsl:copy-of select="@*"/>
                <xsl:apply-templates/>
            </xsl:copy>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

预期输出是:

<root>
     <Interaction>
        <RecipientId>672386985145</RecipientId>
        <RecipientType>Normal</RecipientType>
        <MailingId>18848768</MailingId>
        <ReportId>2141674081</ReportId>
        <CampaignId/>
        <Email>cg@gmail.com</Email>
        <EventType>Sent</EventType>
        <EventTimestamp>06/08/202119:28:06</EventTimestamp>
        <BodyType/>
        <ContentId/>
        <ClickName/>
        <URL/>
        <ConversionAction/>
        <ConversionDetail/>
        <ConversionAmount/>
        <SuppressionReason/>
        <MailingName>TrendEmailTestSend425(18)</MailingName>
        <MailingSubject>TESTING:YourNovemberTrend-710Campaign</MailingSubject>
        <CONTACT_MC_ID>42010A0351251EDBA6904634DF983CB0</CONTACT_MC_ID>
        <CAMPAIGN_ID>0000000710</CAMPAIGN_ID>
        <SOURCE_OBJECT_ID>42948F6B87172477E4BE993B3EC48255EF4A27D4</SOURCE_OBJECT_ID>
        <UUID>1292721e-8b0e-1d90-1700-1c42c1610f6d</UUID>
    </Interaction>
</root>

刚刚涉足 XSLT。感谢帮助。 满足条件的节点应该被复制到目标。

请勿阅读以下内容。这只是为了让堆栈结束 Stackover*** 要求我提出更多细节问题,但我认为我已经提供了足够的细节来理解问题。

【问题讨论】:

【参考方案1】:

指令:

<xsl:template match="/root/Interaction">

将您置于Interaction 的上下文中。从这个上下文来看,EventType 的测试需要使用当前Interaction 的子EventType 的相对路径 - 例如

<xsl:if test="EventType != 'HardBounce'">

你所拥有的从根开始,测试整个XML文档中是否至少有一个EventType满足条件。这当然适用于 所有 Interaction 正在测试的元素。


请注意,您可以通过以下方式更简单地完成相同的事情:

<xsl:stylesheet version="3.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/root">
    <xsl:copy>
        <xsl:copy-of select="Interaction[EventType != 'HardBounce']"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

【讨论】:

【参考方案2】:

使用空模板&lt;xsl:template match="Interaction[EventType = 'HardBounce']"/&gt; 阻止您不希望复制的元素。如果您使用的是 XSLT 3,则通过您的第一个模板处理其余部分,甚至通过声明 &lt;xsl:mode on-no-match="shallow-copy"/&gt; 来替换它。

【讨论】:

以上是关于应将具有 EventType != 'HardBounce' 的输入 XML 复制到输出的主要内容,如果未能解决你的问题,请参考以下文章

Rails Event EventType模型关联 - nil的未定义方法`title':NilClass

unity, EventType.MouseUp注意事项

反应将 onClick 值从一个类传递到另一个类

EventType

EventType

EventType