2017-01-16 84 views
1

給定以下XML文檔。XSLT在SSIS XML任務中轉換,僅輸出XML文檔的某些節點

<?xml version="1.0" encoding="UTF-8"?> 
<TrainingCenterDatabase 
    xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd" 
    xmlns:ns5="http://www.garmin.com/xmlschemas/ActivityGoals/v1" 
    xmlns:ns3="http://www.garmin.com/xmlschemas/ActivityExtension/v2" 
    xmlns:ns2="http://www.garmin.com/xmlschemas/UserProfile/v2" 
    xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns4="http://www.garmin.com/xmlschemas/ProfileExtension/v1"> 
    <Activities> 
    <Activity Sport="Other"> 
     <Id>2017-01-13T19:26:50.000Z</Id> 
     <Lap StartTime="2017-01-13T19:26:50.000Z"> 
     <TotalTimeSeconds>600.0</TotalTimeSeconds> 
     <DistanceMeters>0.0</DistanceMeters> 
     <Calories>42</Calories> 
     <AverageHeartRateBpm> 
      <Value>89</Value> 
     </AverageHeartRateBpm> 
     <MaximumHeartRateBpm> 
      <Value>100</Value> 
     </MaximumHeartRateBpm> 
     <Intensity>Active</Intensity> 
     <TriggerMethod>Manual</TriggerMethod> 
     <Track> 
      <Trackpoint> 
      <Time>2017-01-13T19:26:50.000Z</Time> 
      <AltitudeMeters>-51.599998474121094</AltitudeMeters> 
      <HeartRateBpm> 
       <Value>84</Value> 
      </HeartRateBpm> 
      <Extensions> 
       <ns3:TPX/> 
      </Extensions> 
      </Trackpoint> 
      <Trackpoint> 
      <Time>2017-01-13T19:26:51.000Z</Time> 
      <AltitudeMeters>-51.599998474121094</AltitudeMeters> 
      <HeartRateBpm> 
       <Value>84</Value> 
      </HeartRateBpm> 
      <Extensions> 
       <ns3:TPX/> 
      </Extensions> 
      </Trackpoint> 
      <Trackpoint> 
      <Time>2017-01-13T19:26:54.000Z</Time> 
      <AltitudeMeters>-0.6000000238418579</AltitudeMeters> 
      <HeartRateBpm> 
       <Value>84</Value> 
      </HeartRateBpm> 
      <Extensions> 
       <ns3:TPX/> 
      </Extensions> 
      </Trackpoint> 
     </Track> 
     <Extensions> 
      <ns3:LX/> 
     </Extensions> 
     </Lap> 
     <Creator xsi:type="Device_t"> 
     <Name>Garmin Forerunner 910XT</Name> 
     <UnitId>3881635667</UnitId> 
     <ProductID>1328</ProductID> 
     <Version> 
      <VersionMajor>3</VersionMajor> 
      <VersionMinor>20</VersionMinor> 
      <BuildMajor>0</BuildMajor> 
      <BuildMinor>0</BuildMinor> 
     </Version> 
     </Creator> 
    </Activity> 
    </Activities> 
    <Author xsi:type="Application_t"> 
    <Name>Garmin Connect API</Name> 
    <Build> 
     <Version> 
     <VersionMajor>16</VersionMajor> 
     <VersionMinor>23</VersionMinor> 
     <BuildMajor>0</BuildMajor> 
     <BuildMinor>0</BuildMinor> 
     </Version> 
    </Build> 
    <LangID>en</LangID> 
    <PartNumber>006-D2449-00</PartNumber> 
    </Author> 
</TrainingCenterDatabase> 

和下面的XSLT。 (我一直在嘗試各種不同的版本,但我甚至不能讓它出口任何東西)

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:gar="http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:template match="/"> 
<xsl:copy-of select="gar:TrainingCenterDatabase/gar:Activities/gar:Activity/gar:Track"/> 
</xsl:template> 
</xsl:stylesheet> 

我撕裂了我的頭髮試圖導出XML的某些節點。

編輯。從XML中添加到命名空間中。 編輯。在命名空間和別名中添加。

我想要的是這個。

<Trackpoint> 
    <Time>2017-01-13T19:26:54.000Z</Time> 
    <HeartRateBpm>84</HeartRateBpm> 
    </Trackpoint> 
    <Trackpoint> 
    <Time>2017-01-13T19:26:54.000Z</Time> 
    <HeartRateBpm>84</HeartRateBpm> 
    </Trackpoint> 
    <Trackpoint> 
    <Time>2017-01-13T19:27:54.000Z</Time> 
    <HeartRateBpm>85</HeartRateBpm> 
    </Trackpoint> 
    <Trackpoint> 
    <Time>2017-01-13T19:28:54.000Z</Time> 
    <HeartRateBpm>90</HeartRateBpm> 
    </Trackpoint> 
    etc. 

任何幫助表示讚賞。

+1

看起來像您遇到命名空間的麻煩。 [這個問題]的答案(http://stackoverflow.com/questions/1730875/xslt-transform-xml-with-namespaces)可能會有所幫助。 – teppic

+0

我用名稱空間更新了XLST。當我在選擇副本中使用「*」時它起作用。但任何時候我都可以改變它來尋找其他任何虛無n。。 –

+0

您需要使用前綴 - 請參閱:http://stackoverflow.com/a/34762628/3016153請注意,XML(以及隨後的樣式表中)中的大部分名稱空間聲明都未使用,因此也是多餘的。 - 還要注意你顯示的輸出不是格式良好的XML(沒有單個根元素)。 –

回答

4

有兩個原因,當前的嘗試不起作用:

  1. 您輸入XML使用的默認命名空間是 "http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2",不 "http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd"爲 你在你的樣式表聲明;

  2. Track元素的路徑不正確 - 您錯過了 Lap步驟。

解決這兩個問題會得到一個結果,即Track元素的深層副本。

但是,我懷疑這是你想要的結果,因爲它將被複制,如 - 包括默認的命名空間。爲了得到沒有命名空間的結果,你需要創建新的元素,而不是從源文件拷貝。試一下,比如:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:gar="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" 
exclude-result-prefixes="gar"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/gar:TrainingCenterDatabase"> 
    <Track> 
     <xsl:for-each select="gar:Activities/gar:Activity/gar:Lap/gar:Track/gar:Trackpoint"> 
      <Trackpoint> 
       <Time> 
        <xsl:value-of select="gar:Time"/>     
       </Time> 
       <HeartRateBpm> 
        <xsl:value-of select="gar:HeartRateBpm/gar:Value"/> 
       </HeartRateBpm> 
      </Trackpoint> 
     </xsl:for-each> 
    </Track> 
</xsl:template> 

</xsl:stylesheet> 

應用到你的輸入例子,結果將是:

<?xml version="1.0" encoding="UTF-8"?> 
<Track> 
    <Trackpoint> 
     <Time>2017-01-13T19:26:50.000Z</Time> 
     <HeartRateBpm>84</HeartRateBpm> 
    </Trackpoint> 
    <Trackpoint> 
     <Time>2017-01-13T19:26:51.000Z</Time> 
     <HeartRateBpm>84</HeartRateBpm> 
    </Trackpoint> 
    <Trackpoint> 
     <Time>2017-01-13T19:26:54.000Z</Time> 
     <HeartRateBpm>84</HeartRateBpm> 
    </Trackpoint> 
</Track>