过滤被阻止的日期XSLT

时间:2017-04-17 10:49:36

标签: xslt filter nodes

拥有以下输入

Sample Input : 

<GetShippingTimeSlotsRes xmlns:xsdLocal="example.com/xml/ShippingTimeSlotsRes" xmlns="example.com/xml/ShippingTimeSlotsRes">
    <xsdLocal:GetShippingTimeSlotsRes>
        <xsdLocal:Weekdate>04/24/2017</xsdLocal:Weekdate>
        <xsdLocal:Weekday>1</xsdLocal:Weekday>
        <xsdLocal:Category>2</xsdLocal:Category>
        <xsdLocal:From>08:00</xsdLocal:From>
        <xsdLocal:To>18:00</xsdLocal:To>
        <xsdLocal:AvailabilityId>1</xsdLocal:AvailabilityId>
        <xsdLocal:Sequence>2</xsdLocal:Sequence>
    </xsdLocal:GetShippingTimeSlotsRes>
    <xsdLocal:GetShippingTimeSlotsRes>
        <xsdLocal:Weekdate>04/25/2017</xsdLocal:Weekdate>
        <xsdLocal:Weekday>3</xsdLocal:Weekday>
        <xsdLocal:Category>3</xsdLocal:Category>
        <xsdLocal:From>13:00</xsdLocal:From>
        <xsdLocal:To>18:00</xsdLocal:To>
        <xsdLocal:AvailabilityId>1</xsdLocal:AvailabilityId>
        <xsdLocal:Sequence>123</xsdLocal:Sequence>
    </xsdLocal:GetShippingTimeSlotsRes>
    <xsdLocal:GetShippingTimeSlotsRes>
        <xsdLocal:Weekdate>04/26/2017</xsdLocal:Weekdate>
        <xsdLocal:Weekday>3</xsdLocal:Weekday>
        <xsdLocal:Category>3</xsdLocal:Category>
        <xsdLocal:From>13:00</xsdLocal:From>
        <xsdLocal:To>18:00</xsdLocal:To>
        <xsdLocal:AvailabilityId>1</xsdLocal:AvailabilityId>
        <xsdLocal:Sequence>123</xsdLocal:Sequence>
    </xsdLocal:GetShippingTimeSlotsRes>
    <xsdLocal:GetShippingTimeSlotsRes>
        <xsdLocal:Weekdate>04/27/2017</xsdLocal:Weekdate>
        <xsdLocal:Weekday>3</xsdLocal:Weekday>
        <xsdLocal:Category>3</xsdLocal:Category>
        <xsdLocal:From>13:00</xsdLocal:From>
        <xsdLocal:To>18:00</xsdLocal:To>
        <xsdLocal:AvailabilityId>1</xsdLocal:AvailabilityId>
        <xsdLocal:Sequence>123</xsdLocal:Sequence>
    </xsdLocal:GetShippingTimeSlotsRes>
    <xsdLocal:GetShippingTimeSlotsRes>
        <xsdLocal:Weekdate>04/28/2017</xsdLocal:Weekdate>
        <xsdLocal:Weekday>3</xsdLocal:Weekday>
        <xsdLocal:Category>6</xsdLocal:Category>
        <xsdLocal:From>18:00</xsdLocal:From>
        <xsdLocal:To>22:00</xsdLocal:To>
        <xsdLocal:AvailabilityId>1</xsdLocal:AvailabilityId>
        <xsdLocal:Sequence>123</xsdLocal:Sequence>
    </xsdLocal:GetShippingTimeSlotsRes>
    <xsdLocal:BlockedDates>
        <xsdLocal:Date>04/24/2017</xsdLocal:Date>
    </xsdLocal:BlockedDates>
    <xsdLocal:BlockedDates>
        <xsdLocal:Date>04/27/2017</xsdLocal:Date>
    </xsdLocal:BlockedDates>
</GetShippingTimeSlotsRes>

示例输出:

<GetShippingTimeSlotsRes xmlns:xsdLocal="example.com/xml/ShippingTimeSlotsRes" xmlns="example.com/xml/ShippingTimeSlotsRes">
    <xsdLocal:GetShippingTimeSlotsRes>
        <xsdLocal:Weekdate>04/25/2017</xsdLocal:Weekdate>
        <xsdLocal:Weekday>3</xsdLocal:Weekday>
        <xsdLocal:Category>3</xsdLocal:Category>
        <xsdLocal:From>13:00</xsdLocal:From>
        <xsdLocal:To>18:00</xsdLocal:To>
        <xsdLocal:AvailabilityId>1</xsdLocal:AvailabilityId>
        <xsdLocal:Sequence>123</xsdLocal:Sequence>
    </xsdLocal:GetShippingTimeSlotsRes>
    <xsdLocal:GetShippingTimeSlotsRes>
        <xsdLocal:Weekdate>04/26/2017</xsdLocal:Weekdate>
        <xsdLocal:Weekday>3</xsdLocal:Weekday>
        <xsdLocal:Category>3</xsdLocal:Category>
        <xsdLocal:From>13:00</xsdLocal:From>
        <xsdLocal:To>18:00</xsdLocal:To>
        <xsdLocal:AvailabilityId>1</xsdLocal:AvailabilityId>
        <xsdLocal:Sequence>123</xsdLocal:Sequence>
    </xsdLocal:GetShippingTimeSlotsRes>
    <xsdLocal:GetShippingTimeSlotsRes>
        <xsdLocal:Weekdate>04/28/2017</xsdLocal:Weekdate>
        <xsdLocal:Weekday>3</xsdLocal:Weekday>
        <xsdLocal:Category>6</xsdLocal:Category>
        <xsdLocal:From>18:00</xsdLocal:From>
        <xsdLocal:To>22:00</xsdLocal:To>
        <xsdLocal:AvailabilityId>1</xsdLocal:AvailabilityId>
        <xsdLocal:Sequence>123</xsdLocal:Sequence>
    </xsdLocal:GetShippingTimeSlotsRes>
    <xsdLocal:BlockedDates>
        <xsdLocal:Date>04/24/2017</xsdLocal:Date>
    </xsdLocal:BlockedDates>
    <xsdLocal:BlockedDates>
        <xsdLocal:Date>04/27/2017</xsdLocal:Date>
    </xsdLocal:BlockedDates>
</GetShippingTimeSlotsRes>

输入包含 2部分

1)带有时间段的日期列表 2)阻止日期列表

与被阻止日期相关的时段必须根据下面的日期进行过滤。

尝试了多种方法,但似乎都没有效果。

在上面显示的示例中,2017年4月24日和27日显示为阻止日期,在输出中不应该有任何节点&#34; xsdLocal:GetShippingTimeSlotsRes&#34;其周期与这些日期相匹配

请帮忙吗?

1 个答案:

答案 0 :(得分:1)

您没有指定XSLT版本,因此我使用的是2.0版。

整个事情归结为创建匹配的模板 &#34;禁止&#34;中 的项目(时间段)列表和 与他们无关。

将输出剩余时间段(和其他内容) 身份模板。

如何创建此模板:

  • 为阻止日期(开头)创建密钥。
  • 在此选择属性中包含对此键的引用 &#34;什么也不做&#34;模板。

XML中的一个奇怪点是你的root GetShippingTimeSlotsRes 标签 与下属 GetShippingTimeSlotsRes 标记具有相同的名称。

仅提及从属标记,我包含 GetShippingTimeSlotsRes 匹配属性中的两次。

如您所见,下面有一个可行的解决方案,非常简短。

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xsdLocal="example.com/xml/ShippingTimeSlotsRes"
  xpath-default-namespace="example.com/xml/ShippingTimeSlotsRes">
  <xsl:output method="xml" encoding="UTF-8" indent="yes" />
  <xsl:strip-space elements="*"/>
  <xsl:key name="dates" match="BlockedDates/Date" use="."/>

  <xsl:template match="GetShippingTimeSlotsRes/GetShippingTimeSlotsRes[key('dates',Weekdate)]"/>

  <xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
  </xsl:template>
</xsl:transform>