2016-04-13 1 views
0

У меня есть XML-файл с несколькими узлами сестры, один из которых хранит временные метки <TIMESTAMP>, другой с категориальными кодами <Code>, а другой с целыми значениями <Count>. Я хочу рассчитать разницу в значениях <Count>, за <Code>, связанных с первым и последним <TIMESTAMP>. Есть несколько кодов ... Я немного упростил XML. Результат этого вычисления затем заполнит одну из двух ячеек в таблице HTML. Я ограничен использованием XSLT 1.0 для преобразования XML в HTML.Добавление значений из узлов XML на основе первой и последней дат с использованием XSLT

Вот фрагмент из XML:

XML

<?xml version="1.0" encoding="UTF-8"?> 
<surveyGDB> 
    <table> 
    <tablename>QaQcPoints 
     <record> 
     <OBJECTID>1</OBJECTID> 
     <TIMESTAMP>20150722 09:18:43</TIMESTAMP> 
     <Code>tp</Code> 
     <Count>50</Count> 
     </record> 
     <record> 
     <OBJECTID>2</OBJECTID> 
     <TIMESTAMP>20150722 09:18:43</TIMESTAMP> 
     <Code>bl</Code> 
     <Count>110</Count> 
     </record> 
     <record> 
     <OBJECTID>5</OBJECTID> 
     <TIMESTAMP>20150730 01:05:22</TIMESTAMP> 
     <Code>bl</Code> 
     <Count>100</Count> 
     </record> 
     <record> 
     <OBJECTID>6</OBJECTID> 
     <TIMESTAMP>20150730 01:05:22</TIMESTAMP> 
     <Code>tp</Code> 
     <Count>55</Count> 
     </record> 
    </tablename> 
    </table> 
</surveyGDB> 

Выходной HTML таблица должна выглядеть примерно так:

HTML

---------------------------- 
| Code | Added | Deleted | 
---------------------------- 
| tp  | 5  | 0  | 
---------------------------- 
| bl  | 0  | 10  | 
---------------------------- 

Я предполагаю, что мне нужно отсортировать значения <TIMESTAMP> и найти первую и последнюю позиции отсортированных значений. Вот соответствующий код XSL У меня есть для нахождения значения <Count>, связанный с первой временной меткой:

XSL

<xsl:for-each select="/surveyGDB/table/tablename/record" /> 
    <xsl:sort select="TIMESTAMP" /> 
     <xsl:choose> 
      <xsl:when test="position() = 1"> 
       <xsl:value-of select="Count" /> 
      </xsl:when> 
     </xsl:choose> 

Но как мне найти последнюю метку времени, а затем, как я тогда группировать рассчитано <Count> значениями <Code>?

Любые советы о том, как наилучшим образом подойти к этому?

ответ

1

Начать с видом на muenchian grouping

И попробовать что-то вроде этого:

<xsl:key name="krecord" match="record" use="Code"/> 

<xsl:template match="tablename"> 
    <xsl:for-each select="record [ 
         count (key('krecord',./Code)[1] | .) = 1]"> 

    <xsl:variable name="this" select="." /> 
    <!-- group stuff --> 

    <xsl:for-each select=" key('krecord',$this/Code)"> 
     <!-- group member stuff --> 

    </xsl:for-each> 
    </xsl:for-each> 
</xsl:template> 

И чем добавить первый, последний, добавить дифф «расчет» для основной идеи попробовать:

<xsl:key name="krecord" match="record" use="Code"/> 

<xsl:template match="tablename"> 
    <xsl:for-each select="record [ 
          count (key('krecord',./Code)[1] | .) = 1]"> 

     <xsl:variable name="this" select="." /> 
     <!-- group stuff --> 
     <xsl:variable name="first" > 
     <xsl:for-each select=" key('krecord',$this/Code)"> 
      <xsl:sort select="TIMESTAMP" /> 
      <xsl:choose> 
       <xsl:when test="position() = 1"> 
        <xsl:value-of select="Count" /> 
       </xsl:when> 
      </xsl:choose> 
     </xsl:for-each> 
     </xsl:variable> 

     <xsl:variable name="last" > 
     <xsl:for-each select=" key('krecord',$this/Code)"> 
      <xsl:sort select="TIMESTAMP" /> 
      <xsl:choose> 
       <xsl:when test="position() = last()"> 
        <xsl:value-of select="Count" /> 
       </xsl:when> 
      </xsl:choose> 
     </xsl:for-each> 
     </xsl:variable> 

     <xsl:variable name="diff" select="$first - $last " /> 
     <xsl:choose> 
     <xsl:when test="$diff >= 0" > 
       <xsl:value-of select="Code" />, <xsl:value-of select="$diff" />,0;  
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="Code" />, 0, <xsl:value-of select="$diff" />; 
     </xsl:otherwise>  
     </xsl:choose> 

    </xsl:for-each> 
</xsl:template> 
+0

Это отлично. Спасибо! – jesselangdon

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