2011-07-27 9 views
2

を動作させることはできません私はKMLは、国とファイルを持っていることは、すべての国を持っている 分割KMLしかしそれは

<Document> 
    ... 
     <Folder> 
      <name>Countries</name> 
      <Style> 
       <ListStyle> 
        <listItemType>checkHideChildren</listItemType> 
        <bgColor>00ffffff</bgColor> 
        <maxSnippetLines>2</maxSnippetLines> 
       </ListStyle> 
      </Style> 
      <Folder> 
       <name>Labels</name> 
       <Placemark> 
        <name>Angola</name> 
        <styleUrl>#NoneIconStyle</styleUrl> 
        <Point> 
         <coordinates>17.5379654426636,-12.2994772211426,0</coordinates> 
        </Point> 
       </Placemark> 
      ... ignore these 

      <Folder> 
       <name>A -</name> 
       <Placemark> 
        <name>Afghanistan</name> 
        <Polygon> 
         <outerBoundaryIs> 
          <LinearRing> 
           <coordinates> 
65.62729644775391,37.33319854736328,0 65.64692687988283,37.45888137817383,0 65.70137023925781,37.53693008422852,0 65.76608276367188,37.53416061401367,0 65.7855224609375,37.56887817382813,0 66.30274963378906,37.32360076904297,0 66.53876495361328,37.36051177978516,0 66.58690643310547,37.36803817749023,0 66.66525268554688,37.33832168579102,0 66.74442291259766,37.36137008666992,0 67.02163696289063,37.37720108032227,0 67.20025634765625,37.24665069580078,0 67.22942352294922,37.19192886352539,0 67.26637268066406,37.18526077270508,0 67.42440795898438,37.23498916625977,0 67.52163696289063,37.27248001098633,0 67.55745697021484,37.21554183959961,0 67.64940643310547,37.24608993530273,0 67.77413940429689,37.20608901977539,0 67.77715301513672,37.18579864501953,0 

と国境を接します。私は各国ごとに別々のファイルを作りたいと思っています。私は最初の 'lables'フォルダを無視し、ツリー内の座標を1つ上にしてFolderを移動したいと思います。だから、Afghanistan.KMLは次のようになり

<?xml version="1.0" encoding="UTF-8"?> 
<kml> 
    <Document> 
     <Folder> 
      <name>Countries</name> 
       <Placemark> 
        <name>Afghanistan</name> 
        <Polygon> 
         <outerBoundaryIs> 
          <LinearRing> 
           <coordinates> 
65.62729644775391,37.33319854736328,0 65.64692687988283,37.45888137817383,0 65.70137023925781,37.53693008422852,0 65.76608276367188,37.53416061401367,0 65.7855224609375,37.56887817382813,0 66.30274963378906,37.32360076904297,0 66.53876495361328,37.36051177978516,0 66.58690643310547,37.36803817749023,0 66.66525268554688,37.33832168579102,0 66.74442291259766,37.36137008666992,0 67.02163696289063,37.37720108032227,0 67.20025634765625,37.24665069580078,0 67.22942352294922,37.19192886352539,0 67.26637268066406,37.18526077270508,0 67.42440795898438,37.23498916625977,0 67.52163696289063,37.27248001098633,0 67.55745697021484,37.21554183959961,0 67.64940643310547,37.24608993530273,0 67.77413940429689,37.20608901977539,0 67.77715301513672,37.18579864501953,0 
    ...etc 

<!-- !! -->でマークされた)私のXSLTは、ほぼ

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" version="1.0" omit-xml-declaration="yes"/> 
    <xsl:template match="/"> 
     <xsl:apply-templates select="*[local-name()='kml']/*[local-name()='Document']"/> 
    </xsl:template> 
    <xsl:template match="*[local-name()='kml']/*[local-name()='Document']"> 
     <Document> 
      <xsl:apply-templates select="*[local-name()='Folder']"/> 
     </Document> 
    </xsl:template> 
    <xsl:template match="*[local-name()='Folder']"> 
     <xsl:apply-templates select="*[local-name()='Folder' or local-name()='Placemark']"/> 
    </xsl:template> 
    <xsl:template match="*[local-name()='Placemark']"> 
     <name>{name}</name> <!-- !! --> 
     <xsl:result-document method="xml" href="d:\downloads\countries\{name}.xml">--> 
     <xsl:apply-templates select="*[local-name()='Polygon']"/> 
     </xsl:result-document> 
    </xsl:template> 
    <xsl:template match="*[local-name()='Polygon']"> 
     <Polygon> 
      <xsl:apply-templates select="*[local-name()='outerBoundaryIs']"/> 
     </Polygon> 
    </xsl:template> 
    <xsl:template match="*[local-name()='outerBoundaryIs']"> 
     <outerBoundaryIs> 
      <xsl:apply-templates select="*[local-name()='LinearRing']"/> 
     </outerBoundaryIs> 
    </xsl:template> 
    <xsl:template match="*[local-name()='LinearRing']"> 
     <LinearRing> 
       </LinearRing> 
     <xsl:apply-templates select="*[local-name()='coordinates']"/> 
    </xsl:template> 
    <xsl:template match="*[local-name()='coordinates']"> 
     <coordinates> 
      <xsl:value-of select="."/> 
     </coordinates> 
    </xsl:template> 
</xsl:stylesheet> 

に動作しますが、私は、プロセッサが「名前」を認識し、ファイルを切り替えることができません。

私に手伝ってくれるXSLウィザードがありますか?

ありがとうございます!

+0

入力XMLは、表示した通りですか?あなたのスタイルシートはちょっと複雑に見えますから。 –

答えて

2

内に含まれます。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xpath-default-namespace="http://www.opengis.net/kml/2.2" 
     version="2.0"> 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/"> 
    <xsl:apply-templates select="//Folder[matches(name,'[A-Z] -')]"/> 
    </xsl:template> 

    <xsl:template match="Folder"> 
    <xsl:for-each select="Placemark"> 
     <xsl:result-document href="{name}.xml"> 
     <kml> 
     <Document> 
      <Folder> 
      <name>Countries</name> 
      <xsl:copy-of select="."/> 
      </Folder> 
     </Document> 
     </kml> 
    </xsl:result-document> 
    </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 
+1

これは私に最もよく合い、鮮明で読みやすいものです。すべての答え+1とあなたの助けに感謝、大いに感謝します。 – smirkingman

+0

あなたは大歓迎です! – mzjn

3

私は、「名前」を認識し、(<!-- !! -->でマークされた)ファイルを切り替えるプロセッサを取得することはできません。

<name>{name}</name> <!-- !! --> 
    <xsl:result-document method="xml" href="d:\downloads\countries\{name}.xml"> 

私はあなたがより良い、このような気にいらを書くべきだと思う:

 <name><xsl:value-of select="name"/></name> 
     <xsl:variable name="filename" 
      select="concat('d:\downloads\countries\',name,'.xml')" /> 
     <xsl:result-document method="xml" href="{$filename}"> 

これは、他の同じ行に(読みやすくなるのか、最終的です回答(+1)):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xpath-default-namespace="http://www.opengis.net/kml/2.2" 
    version="2.0"> 
    <xsl:output indent="yes"/> 

    <xsl:template match="/*/*/*/*[matches(name,'[A-Z]\s+-')]/Placemark"> 
     <xsl:result-document href="d:\downloads\countries\{name}.xml"> 
      <kml> 
       <Document> 
        <Folder> 
         <name>Countries</name> 
         <xsl:copy-of select="."/> 
        </Folder> 
       </Document> 
      </kml> 
     </xsl:result-document> 
    </xsl:template> 

</xsl:stylesheet> 
+1

+1 - 私は同じ行に沿って考えていました。しかし、hrefを次のようにしたいとは思わない: 'href =" {$ filename} "'?また、なぜ ''が'に比べて好まれないのかという良い理由が考えられますか?ありがとうempo –

+0

フィードバックありがとうございます。 miscodeを申し訳ありません(修正済み)。 –

+0

私は少し眠いです。本当に良い理由はない、この場合は同じです。 'xsl:copy-of'が短いかもしれません。 –

3

これは、サンプル入力に望ましい出力を与えます。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="2.0"> 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/kml"> 
    <xsl:apply-templates select="Document/Folder[name/text()='Countries']/Folder[name/text()='Labels']/Folder[matches(name/text(),'[A-Z] -')]"/> 
    </xsl:template> 

    <xsl:template match="Folder"> 
    <xsl:variable name="country" select="Placemark/name/text()"/> 
    <xsl:result-document href="{$country}.xml"> 
     <kml> 
     <Document> 
      <Folder> 
      <name>Countries</name> 
      <xsl:copy-of select="Placemark"/> 
      </Folder> 
     </Document> 
     </kml> 
    </xsl:result-document> 
    </xsl:template> 

</xsl:stylesheet> 

それは仮定のカップルを作る...

  1. 文書構造は、国がLabelsフォルダ内の実際にどこで、それを示してきたようです。
  2. 国のフォルダは、次のスタイルシートはhttp://www.calvert.ch/download/world-borders.kmlデータ(注xpath-default-namespace)で動作します指定した正規表現に一致するアルファベット文字のフォルダ
+0

クイック返信ありがとう!私はそれがうまくいきません、ちょうど1つの巨大なファイルを生成します。ここに実際のファイルhttp://www.calvert.ch/download/world-borders.kml(またはXMLSpyを使用しているからですか?) – smirkingman

+0

XMLSpyはxsltプロセッサを使用していますか? –

関連する問題