XSLT

2016-04-13 42 views
0

'u kullanarak ilk ve son tarihlere dayalı XML düğümlerinden değer ekliyorum Birden çok kardeş düğümüne sahip bir XML dosyası var; bir tane <TIMESTAMP> zaman damgası saklayan, başka bir deyişle <Code> kategorik kodları olan bir başka ve <Count> tamsayı değerleri olan bir başka. İlk ve son <TIMESTAMP> ile ilişkili olan <Code>, başına <Count> değerleri arasındaki farkı hesaplamak istiyorum. Birden fazla kod var ... XML'i biraz basitleştirdim. Bu hesaplamanın sonucu, daha sonra bir HTML tablosundaki iki hücreden birini dolduracaktır. XML'i HTML'ye dönüştürmek için XSLT 1.0 kullanıyorum.XSLT

<?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> 

çıktı HTML tablosu bu gibi görünmelidir

XML: Burada

XML snippet'idir

HTML

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

<TIMESTAMP> değerlerini sıralamalıyım ve sıralanmış değerlerin ilk ve son konumlarını bulmalıyım.

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> 

Ama aynı zamanda o nasıl Sonra grubu geçen zaman damgası bulmak ve nasıl: İşte en erken zaman damgası ile ilişkili <Count> değerini bulmak için var alakalı XSL koddeğerleri <Code> tarafından hesaplandı?

Buna en iyi nasıl yaklaşacağınız konusunda herhangi bir tavsiyeniz var mı? Böyle

cevap

1

muenchian grouping

için bir bakışla Başlangıç ​​Ve denemek şey:

<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> 
:
<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> 

Ve daha

son bir temel fikir deneme için fark "hesaplama" ekleyin birinci eklemek
+0

Bu mükemmel. Çok teşekkürler! – jesselangdon