xml - XSLT 交换元素值

标签 xml xslt gpx

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

<?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 吗? 谢谢。

最佳答案

使用身份转换并覆盖这些元素的值:

<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>

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

关于xml - XSLT 交换元素值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11271149/

相关文章:

c# - C# 中基于 XML 的项目文件的设计模式

java - 处理具有大量数据的 XML 文件

javascript - 获取选择框值以用作变量

java 通过 XSD 映射到 XML

Python:类型错误: 'file' 对象没有属性 '__getitem__'

xml - XSL 1.0 如何一次将 div 标签添加到两个元素/文本

javascript - 使用 AJAX 加载的 XSLT,包含仅在 Firefox 中触发的 &lt;script&gt;

xml - XSLT:如果标签存在,应用模板;如果不是,选择静态值

java - 如何将文本文件转换为GPX文件?

ios - 确定 GPS 位置是否在 gpx 航迹段内