2012-04-17 68 views
4

嗨我试图使用w3schools XSLT Tryit编辑器来转换KML文件(保存为XML文件),但似乎无法使其工作。下面是我的XML文件中的一个片段:使用XSLT转换XML(以前称为KML)

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

如果我删除了KML标签在正常工作的XML代码,但我宁愿尝试和自动化这一点,不必从许多XML中删除代码。我已经尝试在我的XSLT代码“/ kml/Document/Placemark”中添加“kml”>,但这不起作用。谢谢!

我想我的转换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时出现错误。它说我需要一个根文件夹,因为我只有很多名称和描述标签。有什么方法可以使用XSL添加标签。非常感谢你。对不起,我一直在编辑这个杂乱的问题。

+0

我认为这个问题是与命名空间声明。我还没有针对此问题的解决方案,但有趣的是,如果将环路更改为“kml/Document/Placemark”,并从元素中删除名称空间声明,它就会起作用。 – 2012-04-17 17:11:33

回答

2

添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> 
+0

非常感谢。我试图将转换后的XML导入到Access中,但它不起作用。我得到不正确的语法错误。新转换的XML只是一行代码:理事会上层弹簧 ....是否有任何方法将标签保留在新的XML中?我试图在Access中使用TransformXML方法来提取名称和描述,因为原始KML文件中有很多额外的代码,我不想要。谢谢。我希望这是有道理的。 – Andrew 2012-04-17 18:58:40

+0

将输出方法更改为xml,然后使用 BeWarned 2012-04-17 19:55:26

+0

嗨,谢谢你的帮助。我发布了一个可以使用的解决方案。有没有简单的方法让XSL添加一个根文件夹?或者只是让XSL保留根标签? – Andrew 2012-04-18 21:59:45

2

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

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

在XPath 1.0,您必须指定要使用的每个命名空间的前缀。类似于的路径文档/地标将仅选择地标元素在没有命名空间中。

试试这个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"/> 
0

如果只是你对付我建议KMLCSV转换的KML地标。 (http://sourceforge.net/projects/kmlcsv/)

虽然它不会在线或多边形上工作。

感谢

巴蒂尔