2017-01-29 11 views
0

Я приложил XML-файл, и я хочу скопировать только тот узел, значение атрибута которого является чем-то, в моем случае AHC_. В каждом узле любой атрибут имеет значение, начинающееся с «AHC_», копирует этот узел и игнорирует другие узлы.XSL-копии узлов на основе значения атрибута (как и поиск)

Я пытаюсь выполнить следующие XSL и условие работает, но не копирует узел. Не могли бы вы взглянуть и предложить?

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output encoding="UTF-8" indent="yes" method="xml"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="Schedules"> 
     <xsl:if test="Schedule[@ServiceName='MESAVisToolkit_RetentionProcessor']"> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:if> 
    </xsl:template> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Пример XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Schedules> 
    <Schedule OrganizationKey=" " ScheduleID="13" ServiceName="RetentionProcessor"> 
     <TimingXML> 
      <days> 
       <day ofWeek="-1"> 
        <times> 
         <time>0200</time> 
        </times> 
       </day> 
      </days> 
      <excludedDates/> 
     </TimingXML> 
    </Schedule> 
    <Schedule OrganizationKey=" " ScheduleID="14" ServiceName="MESAVisToolkit_RetentionProcessor"> 
     <TimingXML> 
      <days> 
       <day ofWeek="-1"> 
        <times> 
         <time>0300</time> 
        </times> 
       </day> 
      </days> 
     </TimingXML> 
    </Schedule> 
    <Schedule OrganizationKey=" " ScheduleID="15" ServiceName="MailboxEvaluateAllAutomaticRules"> 
     <TimingXML> 
      <days> 
       <day ofWeek="-1"> 
        <times> 
         <timeRange> 
          <range>0000-2359</range> 
          <interval>1</interval> 
          <onMinute>0</onMinute> 
         </timeRange> 
        </times> 
       </day> 
      </days> 
      <excludedDates/> 
     </TimingXML> 
    </Schedule> 
    <Schedule OrganizationKey=" " ScheduleID="16" ServiceName="MailboxEvaluateAllAutomaticRulesSubMin"> 
     <TimingXML> 
      <days> 
       <day ofWeek="-1"> 
        <times> 
         <timeRange> 
          <range>0000-2359</range> 
          <interval>1</interval> 
          <onMinute>0</onMinute> 
         </timeRange> 
        </times> 
       </day> 
      </days> 
     </TimingXML> 
    </Schedule> 
    <Schedule OrganizationKey=" " ScheduleID="51" ServiceName="AHC_001_01_0100_Get_Schedule"> 
     <TimingXML> 
      <days> 
       <day ofWeek="-1"> 
        <times> 
         <timeRange> 
          <range>0000-2359</range> 
          <interval>5</interval> 
          <onMinute>0</onMinute> 
         </timeRange> 
        </times> 
       </day> 
      </days> 
     </TimingXML> 
    </Schedule> 
    <Schedule OrganizationKey=" " ScheduleID="54" ServiceName="AHC_001_01_0200_Get_Schedule"> 
     <TimingXML> 
      <days> 
       <day ofWeek="-1"> 
        <times> 
         <timeRange> 
          <range>0000-2359</range> 
          <interval>5</interval> 
          <onMinute>0</onMinute> 
         </timeRange> 
        </times> 
       </day> 
      </days> 
     </TimingXML> 
    </Schedule> 
</Schedules> 

Ожидаемый результат:

<?xml version="1.0" encoding="UTF-8"?> 
    <Schedule OrganizationKey=" " ScheduleID="51" ServiceName="AHC_001_01_0100_Get_Schedule"> 
     <TimingXML> 
      <days> 
       <day ofWeek="-1"> 
        <times> 
         <timeRange> 
          <range>0000-2359</range> 
          <interval>5</interval> 
          <onMinute>0</onMinute> 
         </timeRange> 
        </times> 
       </day> 
      </days> 
     </TimingXML> 
    </Schedule> 
    <Schedule OrganizationKey=" " ScheduleID="54" ServiceName="AHC_001_01_0200_Get_Schedule"> 
     <TimingXML> 
      <days> 
       <day ofWeek="-1"> 
        <times> 
         <timeRange> 
          <range>0000-2359</range> 
          <interval>5</interval> 
          <onMinute>0</onMinute> 
         </timeRange> 
        </times> 
       </day> 
      </days> 
     </TimingXML> 
    </Schedule> 
</Schedules> 

ответ

0

условие работает, но не копируя узел.

Это неправда. Все Schedule узлов скопированы без каких-либо условий. Это потому, что ваше состояние не имеет смысла. Это не имеет никакого смысла, потому что это не имеет ничего общего с тем, что вы сказали, что вы хотите:

В каждом узле любой атрибут имеет значение, начинающееся с копией «AHC_», что узел

Еще более важно, это не имеет смысла, поскольку он оценивается из контекста родительского элемента Schedules, а не для отдельных узлов Schedule. Таким образом, если любойSchedule ребенок удовлетворяет условию, вы будете применять шаблоны к (например, копированию) все из них.

Чтобы выборочно скопировать только Schedule элементы, которые удовлетворяют некоторое условие, вы должны структурировать таблицу стилей как:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/Schedules"> 
    <xsl:copy> 
     <xsl:copy-of select="Schedule[--your condition goes here---]"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
+0

Сво работают. Большое спасибо. – GSR