29226


◎XMLスタイルシートのエラーを解決できておりません

・お世話になります。私は生態学を専攻している身でありこの分野に疎く、初歩的な質問大変失礼致します。今年の野外調査のデータを全てkmlファイルに記録し、そのデータ量の多さに整理しあぐねております。データ整理には、スタイルシートによる絞り込みを用いたのですがxPathの指定についてエラーが出てしまいました。

・kmlファイルに含まれるポイントデータ(以下を参照頂けると幸いです)のうち、時間のデータ(`<styleUrl>#msn_red-
blank</styleUrl>`)から鳥のデータ(`<styleUrl>#msn_pink-
blank</styleUrl>`)を分離したいと思っております。

直面している課題は、  
スタイルシートの`<xsl:apply-templates
select="Document/Folder/Placemark[styleUrl=#msn_pink-
blank]"/>`部分に問題があると考えました。styleUrlの部分を他の要素に変えた際にはエラーがなかったため、`[styleUrl=#msn_pink-
blank]`部分の指定が最も問題であると考えています。

海外のサイトも含め、類似事例の検索、xPathの復習も図書で行ったのですが解決策を見いだせず困窮しておりました。もし、ご存じの方がいらっしゃいましたらご教示頂けますと大変うれしく思います。何卒よろしくお願いいたします。

最終的にはオリジナルのkmlファイルを以下のようなファイルに変換したいです。

[code]

    <?xml version="1.0" encoding="UTF-8"?> 
    <kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom"> 
    <Document> 
    <Folder> 
    <Placemark> 
    <name>Route</name> 
    <description><![CDATA[]]>Route</description> 
    <styleUrl>#msn_ylw-pushpin</styleUrl> 
    <MultiGeometry> 
    <LineString> 
    <coordinates> 
    142.748871,42.661877,-12.130737 
    142.748901,42.661919,-6.593933 
    142.748901,42.661919,-6.593933 
    142.748917,42.661915,-3.935120 
    142.748901,42.661934,-7.262329 
    </coordinates> 
    </LineString> 
    </MultiGeometry> 
    </Placemark>
    
    <Placemark><name>2016.06.07 17:53:05 memo</name> 
    <description>左7ノビタキメス警戒</description> 
    <LookAt> 
    <longitude>142.748901</longitude> 
    <latitude>42.661919</latitude> 
    <altitude>0</altitude> 
    <range>5.000000</range> 
    <tilt>0</tilt> 
    <heading>0.005076180966892688</heading> 
    <altitudeMode>relativeToGround</altitudeMode><gx:altitudeMode>relativeToSeaFloor</gx:altitudeMode></LookAt> 
    <styleUrl>#msn_pink-blank</styleUrl> 
    <Point> 
    <coordinates>142.748901,42.661919,-6.593933</coordinates> 
    </Point> 
    </Placemark>
    
    </Folder> 
    </Document> 
    </kml>
    
[/code]

◎エラーメッセージ  
エラーメッセージはこちらです。

[code]

    c:\kml_territory\stylesheet>java Transform q.xml kmlconv.xsl qq.xml 
    ERROR:  'file:/c:/kml_territory/stylesheet/kmlconv.xsl: line 9: XPath式'Document/Folder/Placemark[styleUrl=#msn_pink-blank]'の解析中にエラーが発生しました。' 
    FATAL ERROR:  'file:/c:/kml_territory/stylesheet/kmlconv.xsl: line 9: XPath式'Document/Folder/Placemark[styleUrl=#msn_pink-blank]'の解析中にエラーが発生しました。' 
    Exception in thread "main" javax.xml.transform.TransformerConfigurationException: file:/c:/kml_territory/stylesheet/kmlconv.xsl: line 9: XPath式'Document/Folder/Placemark[styleUrl=#msn_pink-blank]'の解析中にエラーが発生しました。 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(Unknown Source) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTransformer(Unknown Source) 
    at Transform.main(Transform.java:15)
    
[/code]

◎オリジナルのkmlファイル

[code]

    <?xml version="1.0" encoding="UTF-8"?> 
    <kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom"> 
    <Document> 
    <Folder> 
    <Placemark> 
    <name>Route</name> 
    <description><![CDATA[]]>Route</description> 
    <styleUrl>#msn_ylw-pushpin</styleUrl> 
    <MultiGeometry> 
    <LineString> 
    <coordinates> 
    142.748871,42.661877,-12.130737 
    142.748901,42.661919,-6.593933 
    142.748901,42.661919,-6.593933 
    142.748917,42.661915,-3.935120 
    142.748901,42.661934,-7.262329 
    </coordinates> 
    </LineString> 
    </MultiGeometry> 
    </Placemark>
    
    <Placemark><name>17:52</name> 
    <description>2016.06.07 17:52:50</description> 
    <LookAt> 
    <longitude>142.748871</longitude> 
    <latitude>42.661877</latitude> 
    <altitude>0</altitude> 
    <range>5.000000</range> 
    <tilt>0</tilt> 
    <heading>0.005076180966892688</heading> 
    <altitudeMode>relativeToGround</altitudeMode><gx:altitudeMode>relativeToSeaFloor</gx:altitudeMode></LookAt> 
    <styleUrl>#msn_red-blank</styleUrl> 
    <Point> 
    <coordinates>142.748871,42.661877,-12.130737</coordinates> 
    </Point> 
    </Placemark>
    
    <Placemark><name>17:52</name> 
    <description>2016.06.07 17:52:53</description> 
    <LookAt> 
    <longitude>142.748901</longitude> 
    <latitude>42.661919</latitude> 
    <altitude>0</altitude> 
    <range>5.000000</range> 
    <tilt>0</tilt> 
    <heading>0.005076180966892688</heading> 
    <altitudeMode>relativeToGround</altitudeMode><gx:altitudeMode>relativeToSeaFloor</gx:altitudeMode></LookAt> 
    <styleUrl>#msn_red-blank</styleUrl> 
    <Point> 
    <coordinates>142.748901,42.661919,-6.593933</coordinates> 
    </Point> 
    </Placemark>
    
    <Placemark><name>2016.06.07 17:53:05 memo</name> 
    <description>左7ノビタキメス警戒</description> 
    <LookAt> 
    <longitude>142.748901</longitude> 
    <latitude>42.661919</latitude> 
    <altitude>0</altitude> 
    <range>5.000000</range> 
    <tilt>0</tilt> 
    <heading>0.005076180966892688</heading> 
    <altitudeMode>relativeToGround</altitudeMode><gx:altitudeMode>relativeToSeaFloor</gx:altitudeMode></LookAt> 
    <styleUrl>#msn_pink-blank</styleUrl> 
    <Point> 
    <coordinates>142.748901,42.661919,-6.593933</coordinates> 
    </Point> 
    </Placemark>
    
    </Folder> 
    </Document> 
    </kml>
    
[/code]

◎自作のスタイルシート

[code]

    <?xml version="1.0" encoding="UTF-8"?>
    
    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" encoding="UTF-8"/>
    
    <xsl:template match="/"> 
    <kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom"> 
    <xsl:apply-templates select="Document/Folder/Placemark[styleUrl=#msn_pink-blank]"/> 
    </kml> 
    </xsl:template>
    
    <xsl:template match="Placemark"> 
    <xsl:copy> 
    <xsl:apply-templates select="name"/> 
    <xsl:apply-templates select="description"/> 
    <xsl:apply-templates select="Lookat"/> 
    <xsl:apply-templates select="longitude"/> 
    <xsl:apply-templates select="latitude"/> 
    <xsl:apply-templates select="styleUrl"/> 
    <xsl:apply-templates select="Point"/> 
    <xsl:apply-templates select="MultiGeometry"/> 
    <xsl:apply-templates select="LineString"/> 
    <xsl:apply-templates select="coordinates"/> 
    </xsl:copy> 
    </xsl:template>
    
    <xsl:template match="name"> 
    <xsl:copy-of select="."/> 
    </xsl:template>
    
    <xsl:template match="description"> 
    <xsl:copy-of select="."/> 
    </xsl:template>
    
    <xsl:template match="Lookat"> 
    <xsl:copy-of select="."/> 
    </xsl:template>
    
    <xsl:template match="longitude"> 
    <xsl:copy-of select="."/> 
    </xsl:template>
    
    <xsl:template match="latitude"> 
    <xsl:copy-of select="."/> 
    </xsl:template>
    
    <xsl:template match="styleUrl"> 
    <xsl:copy-of select="."/> 
    </xsl:template>
    
    <xsl:template match="Point"> 
    <xsl:copy-of select="."/> 
    </xsl:template>
    
    <xsl:template match="MultiGeometry"> 
    <xsl:copy-of select="."/> 
    </xsl:template>
    
    <xsl:template match="LineString"> 
    <xsl:copy-of select="."/> 
    </xsl:template>
    
    <xsl:template match="coordinates"> 
    <xsl:copy-of select="."/> 
    </xsl:template>
    
    </xsl:stylesheet>
    
[/code]

また、同様の処理を825ファイルぶん行う必要があるのですが、スタイルシートを用いる手法以外により便利な方法がございましたら方針等お示し頂けますと幸いに思います。


CC BY-SA 3.0
2016-09-28T10:09:16.697
29218
2016-09-29T00:46:08.600
2016-09-28T10:21:43.437
18958
18958
question
xml xsl xpath
xPathに係るエラーを解決できておりません


> ERROR: 'file:/c:/kml_territory/stylesheet/kmlconv.xsl: line 9:
> XPath式'Document/Folder/Placemark[styleUrl=#msn_pink-blank]'の解析中にエラーが発生しました。'

は文字列の指定方法の誤りです．文字列リテラル#msn_pink-blankは（この場合）'と'で囲む必要があります．

あと入力XMLがデフォルトネームスペースを使っているとき、スタイルシート側では、その要素を指定するのにネームスペースプリフィックスをつける必要があります．

修正版のスタイルシートは次のようになります．（ちょっと冗長な箇所もあると思いますが...）

[code]

    <?xml version="1.0" encoding="UTF-8"?>
    <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="xml" encoding="UTF-8" indent="yes"/>
    
        <xsl:template match="/"> 
            <kml:kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom"> 
                <xsl:apply-templates select="//kml:Document/kml:Folder/kml:Placemark[string(kml:styleUrl)='#msn_pink-blank']"/> 
            </kml:kml> 
        </xsl:template>
    
        <xsl:template match="kml:Placemark"> 
            <xsl:copy> 
                <xsl:apply-templates select="kml:name"/> 
                <xsl:apply-templates select="kml:description"/> 
                <xsl:apply-templates select="kml:Lookat"/> 
                <xsl:apply-templates select="kml:longitude"/> 
                <xsl:apply-templates select="kml:latitude"/> 
                <xsl:apply-templates select="kml:styleUrl"/> 
                <xsl:apply-templates select="kml:Point"/> 
                <xsl:apply-templates select="kml:MultiGeometry"/> 
                <xsl:apply-templates select="kml:LineString"/> 
                <xsl:apply-templates select="kml:coordinates"/> 
            </xsl:copy> 
        </xsl:template>
    
        <xsl:template match="kml:name"> 
            <xsl:copy-of select="."/> 
        </xsl:template>
    
        <xsl:template match="kml:description"> 
            <xsl:copy-of select="."/> 
        </xsl:template>
    
        <xsl:template match="kml:Lookat"> 
            <xsl:copy-of select="."/> 
        </xsl:template>
    
        <xsl:template match="kml:longitude"> 
            <xsl:copy-of select="."/> 
        </xsl:template>
    
        <xsl:template match="kml:latitude"> 
            <xsl:copy-of select="."/> 
        </xsl:template>
    
        <xsl:template match="kml:styleUrl"> 
            <xsl:copy-of select="."/> 
        </xsl:template>
    
        <xsl:template match="kml:Point"> 
            <xsl:copy-of select="."/> 
        </xsl:template>
    
        <xsl:template match="kml:MultiGeometry"> 
            <xsl:copy-of select="."/> 
        </xsl:template>
    
        <xsl:template match="kml:LineString"> 
            <xsl:copy-of select="."/> 
        </xsl:template>
    
        <xsl:template match="kml:coordinates"> 
            <xsl:copy-of select="."/> 
        </xsl:template>
    
    </xsl:stylesheet>
    
[/code]

結果は次のとおりです．ご期待のものになっていますでしょうか？

[code]

    <?xml version="1.0" encoding="UTF-8"?>
    <kml:kml xmlns="http://www.opengis.net/kml/2.2"
             xmlns:gx="http://www.google.com/kml/ext/2.2"
             xmlns:kml="http://www.opengis.net/kml/2.2"
             xmlns:atom="http://www.w3.org/2005/Atom">
       <Placemark>
          <name>2016.06.07 17:53:05 memo</name>
          <description>左7ノビタキメス警戒</description>
          <styleUrl>#msn_pink-blank</styleUrl>
          <Point> 
                            <coordinates>142.748901,42.661919,-6.593933</coordinates> 
                      </Point>
       </Placemark>
    </kml:kml>
    
[/code]

>
> また、同様の処理を825ファイルぶん行う必要があるのですが、スタイルシートを用いる手法以外により便利な方法がございましたら方針等お示し頂けますと幸いに思います。

XSLTを起動するApache
ANTのbuild.xmlをお作りいただき、対象のフォルダに入力ファイルを集めて、これを対象に一気に変換してしまう方法ではいかがでしょうか？

以上


CC BY-SA 3.0
2016-09-29T00:46:08.600
29226
2016-09-29T00:46:08.600
9503
29218
answer