2017-01-16 51 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>