使用XSLT

时间:2019-04-04 17:05:38

标签: xslt

我有以下KML(XML)文档:

<?xml version="1.0" encoding="utf-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
  <Folder>
    <Placemark>
      <name>my name</name>
      <styleUrl>#my url</styleUrl>
      <ExtendedData>
         <Data name="firstID">
           <value>01234567</value>
         </Data>
         <Data name="secondID">
             <value/>
         </Data>
      </ExtendedData>
      <description>
           long description here
      </description>
      <Point>
         <coordinates>-1.1111,2.22222</coordinates>
      </Point>
      <address>my address</address>
    </Placemark>
  </Folder>
</Document>
</kml>

我已经实现了将节点“地址”移动到“ ExtendedData”,并删除了节点“数据名称=“ secondId””,现在我需要将标签“地址”重命名为“数据名称=“地址”“并将地址值封装到“值”标签中,结果如下:

<?xml version="1.0" encoding="utf-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
  <Folder>
    <Placemark>
      <name>my name</name>
      <styleUrl>#my url</styleUrl>
      <ExtendedData>
         <Data name="Address">
           <value>my address</value>
         </Data>
         <Data name="firstID">
           <value>01234567</value>
         </Data>
      </ExtendedData>
      <description>
           long description here
      </description>
      <Point>
         <coordinates>-1.1111,2.22222</coordinates>
      </Point>
    </Placemark>
  </Folder>
</Document>
</kml>

到目前为止,这是我的XSLT(移动地址并删除secondID):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:kml="http://www.opengis.net/kml/2.2">
<xsl:output method= "xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="kml:address"/>

<xsl:template match="kml:ExtendedData">
   <xsl:copy>
     <xsl:copy-of select="../kml:address"/>
     <xsl:apply-templates/>
   </xsl:copy>
</xsl:template>

<xsl:template match="kml:Data[@name='secondID']" />

</xsl:stylesheet>

要重命名,我尝试过:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:kml="http://www.opengis.net/kml/2.2">
<xsl:output method= "xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="kml:address">
    <Data name="Address">
       <value>
        <xsl:apply-templates select="@* | node()"/>
       </value>
    </Data>
</xsl:template>

<xsl:template match="kml:ExtendedData">
    <xsl:copy>
      <xsl:apply-templates select="@*" />
      <xsl:copy-of select="../kml:Data[@name='Address']"/>
      <xsl:apply-templates select="node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="kml:Data[@name='secondID']" />

</xsl:stylesheet>

这将重命名地址,但是将属性'xmlns =“”添加到标签中,并且不会将新重命名的标签移动到'ExtendedData'中

有什么想法吗?我是XLST的新手。预先感谢

1 个答案:

答案 0 :(得分:3)

怎么样:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:kml="http://www.opengis.net/kml/2.2"
xmlns="http://www.opengis.net/kml/2.2" 
exclude-result-prefixes="kml">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="kml:ExtendedData">
    <xsl:copy>
        <!-- move address to here -->
        <Data name="Address">
            <value>
                <xsl:value-of select="../kml:address"/>
            </value>
        </Data>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

<!-- remove address at original position -->
<xsl:template match="kml:address"/>

</xsl:stylesheet>

请注意在xsl:stylesheet起始标记处添加的名称空间声明。