2012-06-30 2 views
2

cmt에 대한 값을 xslt를 사용하여 GPX 파일 (XML)로 바꾸려고합니다.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

항등 그 요소의 값에 대한 재정의로 변환 사용

<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