2012-06-30 62 views
2

我正在尝试使用xslt交换GPX文件(XML)中元素的名称cmt的值。XSLT交换元素值

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<gpx xmlns="http://www.topografix.com/GPX/1/1" creator="GPS TrackMaker" version="1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"> 
    <metadata> 
     <link href="http://www.trackmaker.com"> 
      <text>Geo Studio Tecnology Ltd</text> 
     </link> 
     <time>2012-06-29T21:53:25Z</time> 
     <bounds minlat="37.772562" minlon="-124.550080" maxlat="49.323978" maxlon="-122.404474"/> 
    </metadata> 
    <wpt lat="46.189580000" lon="-123.824460000"> 
     <ele>0.000000</ele> 
     <name>G02010</name> 
     <cmt>Columbia River Maritime Museum</cmt> 
     <desc>Columbia River Maritime Museum</desc> 
     <sym>Museum</sym> 
    </wpt> 
    <wpt lat="46.189010000" lon="-123.824370000"> 
     <ele>0.000000</ele> 
     <name>G02020</name> 
     <cmt>Marine Dr/17th St</cmt> 
     <desc>Marine Dr/17th St</desc> 
     <sym>Waypoint</sym> 
    </wpt> 
</gpx> 

改造后:

... 
<name>Columbia River Maritime Museum</name> 
<cmt>G02010</cmt> 
... 

是否有人可以显示这个正确的XSLT? 谢谢。

回答

2

使用Identity使用一个代理变换的那些元素的值:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:gpx="http://www.topografix.com/GPX/1/1"> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="gpx:name/text()"> 
     <xsl:value-of select="../../gpx:cmt/text()"/> 
    </xsl:template> 
    <xsl:template match="gpx:cmt/text()"> 
     <xsl:value-of select="../../gpx:name/text()"/> 
    </xsl:template> 
</xsl:stylesheet> 

请注意,你也可以的元素直接匹配(而不是他们text()的),如果你的实际需求(或源输入)更复杂。

这将是这个样子:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:gpx="http://www.topografix.com/GPX/1/1"> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="gpx:name"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|../gpx:cmt/text()"/> 
     </xsl:copy> 
    </xsl:template> 
     <xsl:template match="gpx:cmt"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|../gpx:name/text()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

这是一个稍微更通用的解决方案,但第一个就足够了,给你所提供的输入。

+0

谢谢,你的第一个解决方案效果很好。 – Matt