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 からコードを削除する必要はありません。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 クエリと連結することはできます。ただし、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>

Also not that doing <xsl:template match="/"> matches the document element, which is not the same thing as the root element of the document kml.

Here is a good article about default namespaces: http://www.jenitennison.com/blog/node/36

Note that you might want to do this, to output the CDATA of description

<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 に答える