6

您好我正在尝试使用 w3schools XSLT 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>

还有我的 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>

我认为这将适用于我的目的。

<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 添加标签。非常感谢你。抱歉,我一直在编辑这个凌乱的问题。

4

3 回答 3

4

Tim C 关于命名空间是正确的,但我想补充一点,XSLT 是声明性语言,所以通常当我在样式表中看到 for-each 时,它可以被更适合该语言的东西替换。所以我会使用下面的代码。

<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>
于 2012-04-17T18:43:43.210 回答
2

这是因为在您的 XML 中有一个默认命名空间

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

在 XPath 1.0 中,您必须为要使用的每个名称空间指定一个前缀。像Document/Placemark这样的路径只会选择没有命名空间中的Placemark元素。

试试这个 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:template match="/">
      <xsl:for-each select="kml:kml/kml:Document/kml:Placemark">
         <xsl:value-of select="kml:name"/>
         <xsl:value-of select="kml:description"/>
      </xsl:for-each>
   </xsl:template>
</xsl:stylesheet>

也不是这样做<xsl:template match="/">与文档元素匹配,这与文档kml的根元素不同。

这是一篇关于默认命名空间的好文章:http: //www.jenitennison.com/blog/node/36

请注意,您可能想要这样做,以输出描述的 CDATA

<xsl:value-of select="kml:description" disable-output-escaping="yes"/>
于 2012-04-17T17:17:10.613 回答
0

如果它只是您处理的 Kml 中的地标,我会推荐KMLCSV Converter。(http://sourceforge.net/projects/kmlcsv/)

但它不适用于线条或多边形。

谢谢

谢恩

于 2012-04-18T15:38:33.110 回答