使用XSLT转换XML(以前称为KML)

使用XSLT转换XML(以前称为KML),xml,xslt,kml,Xml,Xslt,Kml,您好,我正在尝试使用W3XSLT Tryit编辑器来转换KML文件(另存为XML文件),但我似乎无法让它工作。以下是我的XML文件的一个片段: <?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2

您好,我正在尝试使用W3XSLT Tryit编辑器来转换KML文件(另存为XML文件),但我似乎无法让它工作。以下是我的XML文件的一个片段:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2">
 <Document>
  <name>Bnsf RR cut</name>
  <open>1</open>
  <Style>
   <ListStyle>
    <ItemIcon>
     <href>kmzicon.png</href>
    </ItemIcon>
   </ListStyle>
  </Style>
  <Folder>
   <name>11/10/11 8:17:20 AM</name>
   <Placemark>
    <name>Track</name>
   </Placemark>
  </Folder>
  <Placemark>
   <name>Gray Mesa</name>
   <description><![CDATA[<img width="800" src="1.jpg"/>]]></description>
   <Point>
    <coordinates>-106.493097,34.446357,1692.000000</coordinates>
   </Point>
  </Placemark>
 </Document>
</kml>

Bnsf RR切割
1.
kmzicon.png
11/10/11上午8:17:20
跟踪
灰色台地
-106.493097,34.446357,1692.000000
还有我的XSLT:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
      <xsl:for-each select="Document/Placemark">
        <xsl:value-of select="name"/>
        <xsl:value-of select="description"/>
      </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

如果我删除XML代码中的kml标记,效果会很好,但我更愿意尝试将其自动化,而不必从大量XML中删除代码。我曾尝试将“kml”添加到XSLT代码“/kml/Document/Placemark”>中,但这不起作用。谢谢大家!

我希望转换后的XML是什么样子的:

 <Document> 
  <Placemark>
   <name>Gray Mesa</name>
   <description><![CDATA[<img width="800" src="1.jpg"/>]]></description>
   <Point>
    <coordinates>-106.493097,34.446357,1692.000000</coordinates>
   </Point>
  </Placemark>
 </Document>

灰色台地
-106.493097,34.446357,1692.000000
我想这对我的目的是有用的

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:kml="http://www.opengis.net/kml/2.2">
   <xsl:template match="/">
  <xsl:for-each select="kml:kml/kml:Document/kml:Placemark">
     <name><xsl:value-of disable-output-escaping="yes" select="kml:name"/></name>
     <description><xsl:value-of disable-output-escaping="yes" select="kml:description"/></description>
  </xsl:for-each>
 </xsl:template>

但是,每个名称和描述标记都包含以下内容:xmlns:kml=”http://www.opengis.net/kml/2.2"
不过,我可以将其与Access查询连接起来。但是,当我尝试导入Access时,确实出现了一个错误。它说我需要一个根文件夹,因为我只有许多名称和描述标签。是否有任何方法可以使用XSL添加标记。非常感谢你。很抱歉,我一直在编辑这个混乱的问题。

这是因为在XML中有一个默认名称空间

<kml xmlns="http://www.opengis.net/kml/2.2" ...

Tim C对名称空间的看法是正确的,但我想补充一点,XSLT是声明性语言,因此通常当我在样式表中看到每个名称时,可以用更适合该语言的内容来替换。因此,我将使用以下代码

<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="text"/>

   <xsl:template match="/">
      <xsl:apply-templates select="kml:kml/kml:Document/kml:Placemark"/>
   </xsl:template>

   <xsl:template match="kml:Placemark">
         <xsl:value-of select="kml:name"/>
         <xsl:value-of select="kml:description"/>
   </xsl:template>

</xsl:stylesheet>

如果其仅在您处理的Kml中放置标记,我建议KMLCSV转换器。(http://sourceforge.net/projects/kmlcsv/)

但它不能用于直线或多边形。

谢谢


Shane

我认为问题在于名称空间声明。我还没有解决这个问题的方法,但有一点很有趣,如果您将循环更改为“kml/Document/Placemark”,并从元素中删除名称空间声明,它就可以工作了。非常感谢。我试图将转换后的XML导入Access,但它不起作用。我得到了不正确的语法错误。新转换的XML只是一长行代码:议会之春之巅。。。。有没有办法在新的XML中保留和标记?我试图在Access中使用TransformXML方法来提取名称和描述,因为原始KML文件中有很多我不想要的额外代码。非常感谢。我希望这是有意义的。将输出方法更改为xml,然后使用Hi。谢谢您的帮助。我已经发布了一个我可以使用的解决方案。有没有简单的方法让XSL添加根文件夹?或者让XSL保留根标记?您只需使用所需的标记围绕名称和描述:或者为kml:Document创建模板,然后在那里创建根节点。
<xsl:value-of select="kml:description" disable-output-escaping="yes"/>
<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="text"/>

   <xsl:template match="/">
      <xsl:apply-templates select="kml:kml/kml:Document/kml:Placemark"/>
   </xsl:template>

   <xsl:template match="kml:Placemark">
         <xsl:value-of select="kml:name"/>
         <xsl:value-of select="kml:description"/>
   </xsl:template>

</xsl:stylesheet>