試圖了解 XML 在 KML 映射中的垂直行業使用。
相關答案 (58961408; 1541744; 1535869) 提供了特殊的解決方法,但沒有提供解釋。我生成KML選舉人分界地圖形狀檔案使用web服務(多個)中,將所得KML被構造類似于參考問題,其中<KML>為根節點,并在同一時間一個命名空間:
<kml xmlns="http://www.opengis.net/kml/2.2" ...> .... </kml>
我的問題是 BaseX 的 XQuery 始終回傳 0 結果,除非我先 fn:translate() ;結果是一堆有選擇地轉義的 XML 子樹,具體取決于檔案內部的節點。查看 BaseX 決議器日志,它認為源是預格式化的結果,無需決議。
通過反復試驗并使用 XSL 的形式作為提示,我設計了一個 XSLT 解決方法:
<KMLSource xmlns:kml="http://www.opengis.net/kml/2.2" ... > ... </KMLSource>
使用 <KMLSource> 重命名 <kml> 根節點,并且將 kml 作為名稱空間屬性呼叫。隨著這一變化,BaseX.XQuery 通過其正常的 FLOWR 色域運行 KML。
但是我將 <KMLSource> 引入作為根節點是任意的,并且必然會對下游產生更糟糕的影響的難以言表的副作用;那么對于KML或什至是SVG(在這方面似乎更混亂),什么是良性解決方法?
如果有這樣一個通用和良性的翻譯,可以在這些垂直領域進行標準的 XML 匯出嗎?我無法測驗答案 58961408,該答案將 xsi 命名空間添加到根目錄,以防它是良性通用解決方案。
編輯:根據評論,一個最小但蹩腳的 [*] 可決議示例無樣式開銷:
<?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" xmlns:atom="http://www.w3.org/2005/Atom">
<Document id="">
<name>Are999</name>
<open>0</open>
<Placemark id="">
<Snippet maxLines="0">
</Snippet>
<name>1</name>
<description><br><br><table class='data' ><tr class='o'><td>shpFID:</td><td>0</td></tr><tr class='e'><td>OBJECTID:</td><td>3889</td></tr><tr class='o'><td>Province:</td><td>AREA</td></tr><tr class='e'><td>CAT_B:</td><td>AREA999</td></tr><tr class='o'><td>WardNo:</td><td>1</td></tr><tr class='e'><td>WardID:</td><td>93504001</td></tr><tr class='o'><td>MapCode:</td><td>AREA999_1</td></tr><tr class='e'><td>MunicName:</td><td>Nonland</td></tr><tr class='o'><td>Shape_Leng:</td><td>1.971403</td></tr><tr class='e'><td>Shape_Area:</td><td>0.1172304</td></tr></table></description>
<visibility>1</visibility>
<Point>
<extrude>1</extrude>
<tessellate>0</tessellate>
<altitudeMode>clampToGround</altitudeMode>
<coordinates>29.359397617,-24.0573315119999,0 </coordinates>
</Point>
<styleUrl>#default</styleUrl>
</Placemark>
<Placemark id="994">
<Snippet maxLines="0">
</Snippet>
<name>995</name>
<description><br><br><table class='data' ><tr class='o'><td>shpFID:</td><td>994</td></tr><tr class='e'><td>OBJECTID:</td><td>3933</td></tr><tr class='o'><td>Province:</td><td>AREA</td></tr><tr class='e'><td>CAT_B:</td><td>AREA999</td></tr><tr class='o'><td>WardNo:</td><td>995</td></tr><tr class='e'><td>WardID:</td><td>935040995</td></tr><tr class='o'><td>MapCode:</td><td>AREA999_99</td></tr><tr class='e'><td>MunicName:</td><td>Nonland</td></tr><tr class='o'><td>Shape_Leng:</td><td>0.6676676</td></tr><tr class='e'><td>Shape_Area:</td><td>0.01426437</td></tr></table></description>
<visibility>1</visibility>
<styleUrl>#default</styleUrl>
<Polygon id="">
<extrude>1</extrude>
<tessellate>0</tessellate>
<altitudeMode>clampToGround</altitudeMode>
<outerBoundaryIs>
<LinearRing>
<coordinates>-29.1979840860001,33.577018037,0 -29.1928647940001,33.5760201429999,0 -29.1928101830001,33.5759909999999,0</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
</Document>
</kml>
The plain identity query returns the KML wrapped in <text>/<line>. One that returns '0 Results / hits' without BaseX.XQuery syntax error:
let $database := db:open("nonland")
for $ballot_station in $database/kml/Document/Placemark
return $ballot_station
BaseX Trace / Log: Compiling:
open database "nonland"
rewrite db:open(database[,path]) to document-node() item: db:open("nonland") -> db:open-pre("nonland", 0)
remove step without results: kml
rewrite cached step to empty sequence: kml -> ()
rewrite cached path to empty sequence: $database_0/()/Document/Placemark -> ()
inline for $ballot_station_1 in ()
inline let $database_0 := db:open-pre("nonland", 0)
simplify FLWOR expression: () Optimized Query: () Query:
let $database := db:open("nonland") for $ballot_station in $database/kml/Document/Placemark return $ballot_station
Result:
- Hit(s): 0 Items ...
PS [*]: Lame in that it does not have enough content for a quick and dirty FLOWR as definitive counterexample. In this GIS jurisdiction Location pins are called Balloon that have Point Placemarks in one section and Polygon Border Placemarks in the later bottom section.
PPS[*] See comment by @MartinHonnen on adding a declaration:
declare default element namespace "http://www.opengis.net/kml/2.2";
let $database := db:open("nonland")
for $ballot_station in $database/kml/Document/Placemark/Point
return $ballot_station
which XQuery returns:
<Point 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" xmlns:atom="http://www.w3.org/2005/Atom">
<extrude>1</extrude>
<tessellate>0</tessellate>
<altitudeMode>clampToGround</altitudeMode>
<coordinates>29.359397617,-24.0573315119999,0</coordinates>
</Point>
But only after excising the magic string opening 'xml' file:
<?xml version="1.0" encoding="UTF-8"?>
So the assumed standard does not tolerate it in a presumed XML stream (error: "The processing instruction target matching "[xX][mM][lL]" is not allowed.") but it is thrown in by vertical subject domain implementations where payloads are not explicitly XML, as XML advisories in cases like KML or SVG streams. My appreciation to @MartinHonnen for the insight, so perhaps someone can now tackle the rhetorical question on a generic but benign workaround as XML continues to show up in numerous unexpected contexts? I can think of explicit checks: ... if payload is XML drop processing instruction magic string ... There's got to be a reason they do not do a no-Op there instead ...
uj5u.com熱心網友回復:
您是否希望能夠像<kml xmlns="http://www.opengis.net/kml/2.2" ...> .... </kml>XQuery一樣選擇在名稱空間中宣告的元素,而無需宣告名稱空間(例如declare namespace kml = "http://www.opengis.net/kml/2.2"; kml:kml/)或默認元素名稱空間(例如declare default element namespace "http://www.opengis.net/kml/2.2"; kml/)?
我希望你需要例如
declare default element namespace "http://www.opengis.net/kml/2.2";
let $database := db:open("nonland")
for $ballot_station in $database/kml/Document/Placemark
但是對于任何 XQuery 處理器,不僅僅是 BaseX。對于任何使用名稱空間的 XML 檔案,您需要在查詢序言中宣告名稱空間以在 XQuery 中使用它們,這不是 KML 特定的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/321722.html
