首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >datax2 NDW数据的XLST样式表

datax2 NDW数据的XLST样式表
EN

Stack Overflow用户
提问于 2017-12-07 23:44:54
回答 1查看 145关注 0票数 0

我有这个xml文件

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP:Body>
    <d2LogicalModel modelBaseVersion="2" xmlns="http://datex2.eu/schema/2/2_0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <exchange>
            <supplierIdentification>
                <country>nl</country>
                <nationalIdentifier>NLNDW</nationalIdentifier>
            </supplierIdentification>
        </exchange>
            <supplierIdentification>
                <country>nl</country>
                <nationalIdentifier>NLNDW</nationalIdentifier>
            </supplierIdentification>
        <payloadPublication lang="nl" xmlns="http://datex2.eu/schema/2/2_0" xsi:type="MeasuredDataPublication">
            <publicationTime>2017-09-22T08:06:40.007Z</publicationTime>
            <publicationCreator>
                <country>nl</country>
                <nationalIdentifier>NLNDW</nationalIdentifier>
            </publicationCreator>
            <measurementSiteTableReference id="NDW01_MT" targetClass="MeasurementSiteTable" version="945"/>
            <headerInformation>
                <confidentiality>noRestriction</confidentiality>
                <informationStatus>real</informationStatus>
            </headerInformation>
            <siteMeasurements xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                <measurementSiteReference id="PZH01_MST_0690_00" targetClass="MeasurementSiteRecord" version="1"/>
                <measurementTimeDefault>2017-09-22T08:05:00Z</measurementTimeDefault>
                <measuredValue index="1">
                    <measuredValue>
                        <basicData xsi:type="TrafficFlow">
                            <vehicleFlow>
                                <vehicleFlowRate>600</vehicleFlowRate>
                            </vehicleFlow>
                        </basicData>
                    </measuredValue>
                </measuredValue>
                <measuredValue index="2">
                    <measuredValue>
                        <basicData xsi:type="TrafficFlow">
                            <vehicleFlow>
                                <vehicleFlowRate>0</vehicleFlowRate>
                            </vehicleFlow>
                        </basicData>
                    </measuredValue>
                </measuredValue>
                <measuredValue index="3">
                    <measuredValue>
                        <basicData xsi:type="TrafficFlow">
                            <vehicleFlow>
                                <vehicleFlowRate>60</vehicleFlowRate>
                            </vehicleFlow>
                        </basicData>
                    </measuredValue>
                </measuredValue>
                <measuredValue index="4">
                    <measuredValue>
                        <basicData xsi:type="TrafficFlow">
                            <vehicleFlow>
                                <vehicleFlowRate>660</vehicleFlowRate>
                            </vehicleFlow>
                        </basicData>
                    </measuredValue>
                </measuredValue>
                <measuredValue index="5">
                    <measuredValue>
                        <basicData xsi:type="TrafficSpeed">
                            <averageVehicleSpeed numberOfInputValuesUsed="10" standardDeviation="6.2">
                                <speed>50</speed>
                            </averageVehicleSpeed>
                        </basicData>
                    </measuredValue>
                </measuredValue>
                <measuredValue index="6">
                    <measuredValue>
                        <basicData xsi:type="TrafficSpeed">
                            <averageVehicleSpeed numberOfInputValuesUsed="0">
                                <speed>-1</speed>
                            </averageVehicleSpeed>
                        </basicData>
                    </measuredValue>
                </measuredValue>
                <measuredValue index="7">
                    <measuredValue>
                        <basicData xsi:type="TrafficSpeed">
                            <averageVehicleSpeed numberOfInputValuesUsed="1">
                                <speed>44</speed>
                            </averageVehicleSpeed>
                        </basicData>
                    </measuredValue>
                </measuredValue>
                <measuredValue index="8">
                    <measuredValue>
                        <basicData xsi:type="TrafficSpeed">
                            <averageVehicleSpeed numberOfInputValuesUsed="11" standardDeviation="6.13">
                                <speed>49</speed>
                            </averageVehicleSpeed>
                        </basicData>
                    </measuredValue>
                </measuredValue>
                <measuredValue index="9">
                    <measuredValue>
                        <basicData xsi:type="TrafficFlow">
                            <vehicleFlow>
                                <vehicleFlowRate>240</vehicleFlowRate>
                            </vehicleFlow>
                        </basicData>
                    </measuredValue>
                </measuredValue>
                <measuredValue index="10">
                    <measuredValue>
                        <basicData xsi:type="TrafficFlow">
                            <vehicleFlow>
                                <vehicleFlowRate>60</vehicleFlowRate>
                            </vehicleFlow>
                        </basicData>
                    </measuredValue>
                </measuredValue>
                <measuredValue index="11">
                    <measuredValue>
                        <basicData xsi:type="TrafficFlow">
                            <vehicleFlow>
                                <vehicleFlowRate>0</vehicleFlowRate>
                            </vehicleFlow>
                        </basicData>
                    </measuredValue>
                </measuredValue>
                <measuredValue index="12">
                    <measuredValue>
                        <basicData xsi:type="TrafficFlow">
                            <vehicleFlow>
                                <vehicleFlowRate>300</vehicleFlowRate>
                            </vehicleFlow>
                        </basicData>
                    </measuredValue>
                </measuredValue>
                <measuredValue index="13">
                    <measuredValue>
                        <basicData xsi:type="TrafficSpeed">
                            <averageVehicleSpeed numberOfInputValuesUsed="4" standardDeviation="3.63">
                                <speed>56</speed>
                            </averageVehicleSpeed>
                        </basicData>
                    </measuredValue>
                </measuredValue>
                <measuredValue index="14">
                    <measuredValue>
                        <basicData xsi:type="TrafficSpeed">
                            <averageVehicleSpeed numberOfInputValuesUsed="1">
                                <speed>54</speed>
                            </averageVehicleSpeed>
                        </basicData>
                    </measuredValue>
                </measuredValue>
                <measuredValue index="15">
                    <measuredValue>
                        <basicData xsi:type="TrafficSpeed">
                            <averageVehicleSpeed numberOfInputValuesUsed="0">
                                <speed>-1</speed>
                            </averageVehicleSpeed>
                        </basicData>
                    </measuredValue>
                </measuredValue>
                <measuredValue index="16">
                    <measuredValue>
                        <basicData xsi:type="TrafficSpeed">
                            <averageVehicleSpeed numberOfInputValuesUsed="5" standardDeviation="3.37">
                                <speed>56</speed>
                            </averageVehicleSpeed>
                        </basicData>
                    </measuredValue>
                </measuredValue>
            </siteMeasurements>
            <siteMeasurements xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                <measurementSiteReference id="PZH01_MST_0661_00" targetClass="MeasurementSiteRecord" version="1"/>
                <measurementTimeDefault>2017-09-22T08:05:00Z</measurementTimeDefault>
                <measuredValue index="1">
                    <measuredValue>
                        <basicData xsi:type="TrafficFlow">
                            <vehicleFlow>
                                <vehicleFlowRate>0</vehicleFlowRate>
                            </vehicleFlow>
                        </basicData>
                    </measuredValue>
                </measuredValue>
                <measuredValue index="2">
                    <measuredValue>
                        <basicData xsi:type="TrafficFlow">
                            <vehicleFlow>
                                <vehicleFlowRate>0</vehicleFlowRate>
                            </vehicleFlow>
                        </basicData>
                    </measuredValue>
                </measuredValue>
                <measuredValue index="3">
                    <measuredValue>
                        <basicData xsi:type="TrafficFlow">
                            <vehicleFlow>
                                <vehicleFlowRate>0</vehicleFlowRate>
                            </vehicleFlow>
                        </basicData>
                    </measuredValue>
                </measuredValue>
                <measuredValue index="4">
                    <measuredValue>
                        <basicData xsi:type="TrafficFlow">
                            <vehicleFlow>
                                <vehicleFlowRate>0</vehicleFlowRate>
                            </vehicleFlow>
                        </basicData>
                    </measuredValue>
                </measuredValue>
                <measuredValue index="5">
                    <measuredValue>
                        <basicData xsi:type="TrafficSpeed">
                            <averageVehicleSpeed numberOfInputValuesUsed="0">
                                <speed>-1</speed>
                            </averageVehicleSpeed>
                        </basicData>
                    </measuredValue>
                </measuredValue>
                <measuredValue index="6">
                    <measuredValue>
                        <basicData xsi:type="TrafficSpeed">
                            <averageVehicleSpeed numberOfInputValuesUsed="0">
                                <speed>-1</speed>
                            </averageVehicleSpeed>
                        </basicData>
                    </measuredValue>
                </measuredValue>
                <measuredValue index="7">
                    <measuredValue>
                        <basicData xsi:type="TrafficSpeed">
                            <averageVehicleSpeed numberOfInputValuesUsed="0">
                                <speed>-1</speed>
                            </averageVehicleSpeed>
                        </basicData>
                    </measuredValue>
                </measuredValue>
                <measuredValue index="8">
                    <measuredValue>
                        <basicData xsi:type="TrafficSpeed">
                            <averageVehicleSpeed numberOfInputValuesUsed="0">
                                <speed>-1</speed>
                            </averageVehicleSpeed>
                        </basicData>
                    </measuredValue>
                </measuredValue>
            </siteMeasurements>
        </payloadPublication>
    </d2LogicalModel>
  </SOAP:Body>
</SOAP:Envelope>

我有一个样式表

代码语言:javascript
复制
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                              xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope"
                              xmlns:pub="http://datex2.eu/schema/2/2_0"
                              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="SOAP:Envelope">
    <xsl:text>publicationTime,country,nationalIdentifier,msmtSiteTableRef_targetClass,msmtSiteTableRef_version,msmtSiteTableRef_id,</xsl:text>
    <xsl:text>msmtSiteRef_targetClass,msmtSiteRef_version,msmtSiteRef_id,measurementTimeDefault,</xsl:text>
    <xsl:text>measuredValue_index,basicData_type,vehicleFlowRate,averageVehicleSpeed_numberOfInputValues,averageVehicleSpeed_value</xsl:text>
    <xsl:text>&#xa;</xsl:text>
    <xsl:apply-templates select="SOAP:Body"/>
  </xsl:template>

  <xsl:template match="SOAP:Body">
    <xsl:apply-templates select="d2LogicalModel"/>
  </xsl:template>

  <xsl:template match="d2LogicalModel">
    <xsl:apply-templates select="pub:payloadPublication"/>
  </xsl:template>

  <xsl:template match="pub:payloadPublication">
    <xsl:apply-templates select="pub:siteMeasurements"/>
  </xsl:template>

  <xsl:template match="pub:siteMeasurements">
      <xsl:value-of select="concat(descendant::pub:measurementSiteReference/@id,',',"/><xsl:text>&#xa;</xsl:text>
    <xsl:apply-templates select="pub:measuredValue"/>
  </xsl:template>

   <xsl:template match="pub:measuredValue">
      <xsl:value-of select="concat(ancestor::pub:payloadPublication/pub:publicationTime,',',
                                 ancestor::pub:payloadPublication/pub:publicationCreator/pub:country,',',
                                 ancestor::pub:payloadPublication/pub:publicationCreator/pub:nationalIdentifier,',',
                                 ancestor::pub:payloadPublication/pub:measurementSiteTableReference/@targetClass,',',
                                 ancestor::pub:payloadPublication/pub:measurementSiteTableReference/@version,',',
                                 ancestor::pub:payloadPublication/pub:measurementSiteTableReference/@id,',',
                                 @index,',',
                                 pub:measuredValue/pub:basicData/@xsi:type,',',
                                 descendant::pub:vehicleFlowRate,',',
                                 descendant::pub:averageVehicleSpeed/@numberOfInputValuesUsed,',',
                                 descendant::pub:speed)"/><xsl:text>&#xa;</xsl:text>

   </xsl:template>

</xsl:stylesheet>

De output now to .csv is this

我无法在单独的列中获取measurementSiteReference/@id。ID对于链接GPS坐标很重要。

我看过这个问题:DATEXII XML file to DataFrame in Python。但是这个样式表是针对单个measurementSiteReference/@id的,而不是针对多个measurementSiteReference/@id的

I would like it like this

有人能为此创建xslt样式表吗??

EN

回答 1

Stack Overflow用户

发布于 2017-12-11 19:51:40

更简单的方法是在一个匹配的模板中执行转换,并获取所有必需的值,如下所示:

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                              xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope"
                              xmlns:pub="http://datex2.eu/schema/2/2_0"
                              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <xsl:output method="text"/>  
  <xsl:strip-space elements="*"/>  
    <xsl:template match="/">
      <!--predefined separator for further use-->
      <xsl:variable name="sep" select="','"/>
      <!--set column names-->
      <xsl:value-of select="concat('publicationTime', $sep,
                               'msmtSiteTableRef_id', $sep,
                                           'country', $sep,
                                'nationalIdentifier', $sep,
                      'msmtSiteTableRef_targetClass', $sep,
                          'msmtSiteTableRef_version', $sep,
                                    'msmtSiteRef_id', $sep,
                            'measurementTimeDefault', $sep,
                               'measuredValue_index', $sep,
                                    'basicData_type', $sep,
                                   'vehicleFlowRate', $sep,
           'averageVehicleSpeed_numberOfInputValues', $sep,
                         'averageVehicleSpeed_value', '&#xa;')"/>    
      <!--predefined separator for further use-->          
      <xsl:for-each select="//pub:siteMeasurements">
          <!--get ids for each further record--> 
          <xsl:variable name="ref.id" select="pub:measurementSiteReference/@id"/>
          <xsl:for-each select="pub:measuredValue">
              <!--get all required values in variables for further result concat-->
              <xsl:variable name="pub.time" select="ancestor::pub:payloadPublication/pub:publicationTime"/>              
              <xsl:variable name="pub.cr.country" select="ancestor::pub:payloadPublication/pub:publicationCreator/pub:country"/>
              <xsl:variable name="pub.cr.natId" select="ancestor::pub:payloadPublication/pub:publicationCreator/pub:nationalIdentifier"/>
              <xsl:variable name="pub.tab.ref.class" select="ancestor::pub:payloadPublication/pub:measurementSiteTableReference/@targetClass"/>
              <xsl:variable name="pub.tab.ref.version" select="ancestor::pub:payloadPublication/pub:measurementSiteTableReference/@version"/>
              <xsl:variable name="pub.tab.ref.id" select="ancestor::pub:payloadPublication/pub:measurementSiteTableReference/@id"/>
              <xsl:variable name="index" select="@index"/>
              <xsl:variable name="pub.basd.type" select="pub:measuredValue/pub:basicData/@xsi:type"/>
              <xsl:variable name="flow.rate" select="descendant::pub:vehicleFlowRate"/>
              <xsl:variable name="in.val.used" select="descendant::pub:averageVehicleSpeed/@numberOfInputValuesUsed"/>              
              <xsl:variable name="speed" select="descendant::pub:speed"/>
              <!--getting result with concat function-->                   
              <xsl:value-of select="concat($pub.time, $sep, 
                                             $ref.id, $sep, 
                                     $pub.cr.country, $sep, 
                                       $pub.cr.natId, $sep, 
                                  $pub.tab.ref.class, $sep, 
                                $pub.tab.ref.version, $sep, 
                                     $pub.tab.ref.id, $sep, 
                                              $index, $sep, 
                                      $pub.basd.type, $sep, 
                                          $flow.rate, $sep, 
                                        $in.val.used, $sep, 
                                            $speed, '&#xa;')"/>                                                 
          </xsl:for-each>
      </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

和结果(正如您的链接中所预期的):

代码语言:javascript
复制
publicationTime,msmtSiteTableRef_id,country,nationalIdentifier,msmtSiteTableRef_targetClass,msmtSiteTableRef_version,msmtSiteRef_id,measurementTimeDefault,measuredValue_index,basicData_type,vehicleFlowRate,averageVehicleSpeed_numberOfInputValues,averageVehicleSpeed_value
2017-09-22T08:06:40.007Z,PZH01_MST_0690_00,nl,NLNDW,MeasurementSiteTable,945,NDW01_MT,1,TrafficFlow,600,,
2017-09-22T08:06:40.007Z,PZH01_MST_0690_00,nl,NLNDW,MeasurementSiteTable,945,NDW01_MT,2,TrafficFlow,0,,
2017-09-22T08:06:40.007Z,PZH01_MST_0690_00,nl,NLNDW,MeasurementSiteTable,945,NDW01_MT,3,TrafficFlow,60,,
2017-09-22T08:06:40.007Z,PZH01_MST_0690_00,nl,NLNDW,MeasurementSiteTable,945,NDW01_MT,4,TrafficFlow,660,,
2017-09-22T08:06:40.007Z,PZH01_MST_0690_00,nl,NLNDW,MeasurementSiteTable,945,NDW01_MT,5,TrafficSpeed,,10,50
2017-09-22T08:06:40.007Z,PZH01_MST_0690_00,nl,NLNDW,MeasurementSiteTable,945,NDW01_MT,6,TrafficSpeed,,0,-1
2017-09-22T08:06:40.007Z,PZH01_MST_0690_00,nl,NLNDW,MeasurementSiteTable,945,NDW01_MT,7,TrafficSpeed,,1,44
2017-09-22T08:06:40.007Z,PZH01_MST_0690_00,nl,NLNDW,MeasurementSiteTable,945,NDW01_MT,8,TrafficSpeed,,11,49
2017-09-22T08:06:40.007Z,PZH01_MST_0690_00,nl,NLNDW,MeasurementSiteTable,945,NDW01_MT,9,TrafficFlow,240,,
2017-09-22T08:06:40.007Z,PZH01_MST_0690_00,nl,NLNDW,MeasurementSiteTable,945,NDW01_MT,10,TrafficFlow,60,,
2017-09-22T08:06:40.007Z,PZH01_MST_0690_00,nl,NLNDW,MeasurementSiteTable,945,NDW01_MT,11,TrafficFlow,0,,
2017-09-22T08:06:40.007Z,PZH01_MST_0690_00,nl,NLNDW,MeasurementSiteTable,945,NDW01_MT,12,TrafficFlow,300,,
2017-09-22T08:06:40.007Z,PZH01_MST_0690_00,nl,NLNDW,MeasurementSiteTable,945,NDW01_MT,13,TrafficSpeed,,4,56
2017-09-22T08:06:40.007Z,PZH01_MST_0690_00,nl,NLNDW,MeasurementSiteTable,945,NDW01_MT,14,TrafficSpeed,,1,54
2017-09-22T08:06:40.007Z,PZH01_MST_0690_00,nl,NLNDW,MeasurementSiteTable,945,NDW01_MT,15,TrafficSpeed,,0,-1
2017-09-22T08:06:40.007Z,PZH01_MST_0690_00,nl,NLNDW,MeasurementSiteTable,945,NDW01_MT,16,TrafficSpeed,,5,56
2017-09-22T08:06:40.007Z,PZH01_MST_0661_00,nl,NLNDW,MeasurementSiteTable,945,NDW01_MT,1,TrafficFlow,0,,
2017-09-22T08:06:40.007Z,PZH01_MST_0661_00,nl,NLNDW,MeasurementSiteTable,945,NDW01_MT,2,TrafficFlow,0,,
2017-09-22T08:06:40.007Z,PZH01_MST_0661_00,nl,NLNDW,MeasurementSiteTable,945,NDW01_MT,3,TrafficFlow,0,,
2017-09-22T08:06:40.007Z,PZH01_MST_0661_00,nl,NLNDW,MeasurementSiteTable,945,NDW01_MT,4,TrafficFlow,0,,
2017-09-22T08:06:40.007Z,PZH01_MST_0661_00,nl,NLNDW,MeasurementSiteTable,945,NDW01_MT,5,TrafficSpeed,,0,-1
2017-09-22T08:06:40.007Z,PZH01_MST_0661_00,nl,NLNDW,MeasurementSiteTable,945,NDW01_MT,6,TrafficSpeed,,0,-1
2017-09-22T08:06:40.007Z,PZH01_MST_0661_00,nl,NLNDW,MeasurementSiteTable,945,NDW01_MT,7,TrafficSpeed,,0,-1
2017-09-22T08:06:40.007Z,PZH01_MST_0661_00,nl,NLNDW,MeasurementSiteTable,945,NDW01_MT,8,TrafficSpeed,,0,-1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47698722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档