2014-03-12 41 views
1

最新版本的ArcGIS中有許多元數據更改。我特別使用10.2版,並試圖更新多個利用多個地理處理工具的Python腳本。這些腳本用於輕鬆搜索元數據以獲取地理處理歷史記錄,並將該信息輸出到文本日誌文件。自定義xslt以僅輸出ArcGIS元數據中的地理處理歷史記錄

ArcGIS中有一個工具,它使用「.NET 3.5 XML軟件使用XSLT 1.0樣式表來轉換ArcGIS項目的元數據或任何XML文件,並將結果保存到XML文件中。」該工具被稱爲XSLT轉換。 ESRI提供了幾個用於此工具的轉換。特別是與我想達到的完全相反:複製除地理​​處理歷史記錄以外的所有元數據。以下是我所指的xslt文件。

<?xml version="1.0" encoding="UTF-8"?> 
<!-- Processes ArcGIS metadata to remove empty XML elements to avoid exporting and validation errors. --> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="no" /> 

    <!-- start processing all nodes and attributes in the XML document --> 
    <!-- any CDATA blocks in the original XML will be lost because they can't be handled by XSLT --> 
    <xsl:template match="/"> 
     <xsl:apply-templates select="node() | @*" /> 
    </xsl:template> 

    <!-- copy all nodes and attributes in the XML document --> 
    <xsl:template match="node() | @*" priority="0"> 
     <xsl:copy> 
      <xsl:apply-templates select="node() | @*" /> 
     </xsl:copy> 
    </xsl:template> 

    <!-- templates below override the default template above that copies all nodes and attributes --> 

    <!-- exclude geoprocessing history --> 
    <xsl:template match="/metadata/Esri/DataProperties/lineage" priority="1"> 
    </xsl:template> 

</xsl:stylesheet> 

我從來沒有用過xslt文件,但我很快就學會了。如果可能的話,我想創建一個只複製地理處理歷史記錄(lineage)的文件,但也要創建一個有效的xml文件。我嘗試了一下,但是當我使用我的轉換時,結果是一個類似「會導致無效的XML文檔」的錯誤。

任何幫助,將不勝感激。

+1

您可以發佈您的示例輸入XML和預期輸出XML嗎? –

回答

0

你應該能夠使用這樣的事情:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="no" /> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/*"> 
     <results> 
      <xsl:apply-templates select="Esri/DataProperties/lineage"/> 
     </results> 
    </xsl:template> 

</xsl:stylesheet> 

或者更簡單(因爲你不是在lineage進行任何修改):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="no" /> 

    <xsl:template match="/*"> 
     <results> 
      <xsl:copy-of select="Esri/DataProperties/lineage"/> 
     </results> 
    </xsl:template> 

</xsl:stylesheet> 

它目前包裹輸出results ,但是如果只有一個lineage,您可以更改或完全刪除它。

我也很驚訝ESRI沒有在這個XML中使用名稱空間。如果您有任何問題,請按照Lingamurthy CS的建議添加示例輸入和輸出。

+0

謝謝丹尼爾!這正是我所期待的。我選擇了更簡單的第二個例子。 – jencarta

+0

@jencarta - 非常歡迎! –