2013-06-17 5 views
2

Я стараюсь держаться подальше от процедурного подхода с этим решением, и я не уверен, что это возможно.Использование шаблонов XSLT 1.0 только при определенных значениях атрибутов

Вот мой XML:

<countData> 
<count countId="37" name="Data Response 1"> 
    <year yearId="2013"> 
     <month monthId="5"> 
      <day dayId="23" countVal="6092"/> 
      <day dayId="24" countVal="6238"/> 
      <day dayId="27" countVal="6324"/> 
      <day dayId="28" countVal="6328"/> 
      <day dayId="29" countVal="3164"/> 
     </month> 
      <day dayId="23" countVal="7000"/> 
      <day dayId="24" countVal="7000"/> 
      <day dayId="27" countVal="7000"/> 
      <day dayId="28" countVal="7000"/> 
      <day dayId="29" countVal="7000"/> 
     </month> 
    </year> 
</count> 
<count countId="39" name="Data Response 2"> 
    <year yearId="2013"> 
     <month monthId="5"> 
      <day dayId="23" countVal="675"/> 
      <day dayId="24" countVal="709"/> 
      <day dayId="27" countVal="754"/> 
      <day dayId="28" countVal="731"/> 
      <day dayId="29" countVal="377"/> 
     </month> 
    </year> 
</count> 

Я хочу подать заявление-шаблоны (в данном примере) для всех подсчета/@ countIds, которые 37 или 39. Вот где я:

<xsl:template match="/"> 

    <xsl:apply-templates mode="TimeFrame"/> 

</xsl:template> 

<xsl:template match="*" mode="TimeFrame"> 

    <xsl:if test="count[@countId=37] or count[@countId=39]"> 
     <magic>Only hitting this once for countId 37</magic> 
    </xsl:if> 

</xsl:template> 

У меня будет довольно много таких шаблонов с «режимами», так как я обрабатываю один и тот же ответ множеством разных способов.

Не знаю, как я пропускаю «диапазон» матч и получение только 1.

Я уверен, что он должен делать с моим «процедурным умом». :)

Любая помощь на этом была бы замечательной!

Спасибо,

ответ

0

Ваш главный шаблон, <xsl:template match="/">, работает только один раз, а именно - для <countData> элемента.

Это означает, что вы либо забыли рекурсию:

<xsl:template match="*" mode="TimeFrame"> 

    <xsl:if test="count[@countId=37] or count[@countId=39]"> 
     <magic>Only hitting this once for countId 37</magic> 
    </xsl:if> 

    <xsl:apply-templates mode="TimeFrame"/> <!-- ! --> 

</xsl:template> 

... или вы не смогли установить правильный контекст для основного шаблона:

<xsl:template match="/countData"><!-- ! --> 

    <xsl:apply-templates mode="TimeFrame"/> 

</xsl:template> 

<!-- or, alternatively --> 

<xsl:template match="/"> 

    <xsl:apply-templates select="countData/*" mode="TimeFrame"/> 

</xsl:template> 
+0

Моя проблема в том, что я пытаясь оценить значение «countId» до того, как я начну вращаться через дочерние узлы. Добавление шаблона apply-select = "*" в режиме шаблона = "TimeFrame" заставляет рекурсию произойти в этих дочерних элементах. Я просто хочу сделать «match» на «countIDs», которые являются значениями x, y, z и THEN обрабатывают их дочерние узлы. – Steve

+0

На самом деле, у меня была опечатка после того, как я попытался принять ваш совет. Это работает точно так, как я этого хотел. Спасибо! – Steve

 Смежные вопросы

  • Нет связанных вопросов^_^