我有这个xml文件
<?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>我有一个样式表
<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>
</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>
</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>
</xsl:text>
</xsl:template>
</xsl:stylesheet>我无法在单独的列中获取measurementSiteReference/@id。ID对于链接GPS坐标很重要。
我看过这个问题:DATEXII XML file to DataFrame in Python。但是这个样式表是针对单个measurementSiteReference/@id的,而不是针对多个measurementSiteReference/@id的
有人能为此创建xslt样式表吗??
发布于 2017-12-11 19:51:40
更简单的方法是在一个匹配的模板中执行转换,并获取所有必需的值,如下所示:
<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', '
')"/>
<!--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, '
')"/>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>和结果(正如您的链接中所预期的):
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,-1https://stackoverflow.com/questions/47698722
复制相似问题