2015-02-06 55 views
0

在下面的XML中,需要使用XPath替換名稱空間。如何使用xpath替換xml中的第一個節點屬性值

<application xmlns="http://ns.adobe.com/air/application/4.0"> 
    <child id="1"></child> 
    <child id="2"></child> 
</application> 

我試着用

/application/@xmlns 

/*[local-name()='application']/@[local-name()='xmlns'] 

雙方未能給予的願望輸出。爲了替換文本,我使用了xmltask替換。

<xmltask source="${temp.file1}" dest="${temp.file1}"> 
    <replace path="/application/@xmlns" withText="http://ns.adobe.com/air/application/16.0" /> 
</xmltask> 
+0

您可以發佈您的代碼,您已經使用了更換? – ArinCool 2015-02-06 07:08:12

回答

5

問題是xmlns不是屬性。您無法使用XPath進行選擇。

命名空間是節點名稱的一部分在XML:<foo xmlns="urn:foo-namespace" /><foo xmlns="urn:bar-namespace" />兩次與相同的名稱和不同的屬性節點,它們是具有不同名稱的兩個節點和沒有屬性。

如果要更改命名空間,則必須構造一個全新的節點。

XSLT是更好的適合於這項任務:

<!-- update-air-ns.xsl --> 
<xsl:transform 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:air4="http://ns.adobe.com/air/application/4.0" 
    xmlns="http://ns.adobe.com/air/application/16.0" 
> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes" /> 

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

    <xsl:template match="air4:*"> 
     <xsl:element name="{local-name()}"> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:element> 
    </xsl:template> 
</xsl:transform> 

這XSLT轉換做了兩兩件事:

  • 第一模板(身份模板)遞歸複製節點,除非有更好的匹配給定節點的模板
  • 第二個模板匹配air4名稱空間中的元素,並構造具有相同本地名稱但名稱空間不同的新元素。發生這種情況是因爲XSLT中的默認名稱空間聲明。所有新構造的元素都使用http://ns.adobe.com/air/application/16.0命名空間。

應用到您輸入XML,結果是

<application xmlns="http://ns.adobe.com/air/application/16.0"> 
    <child id="1"/> 
    <child id="2"/> 
</application> 

您可以使用Ant的XSLT任務:

<xslt in="${temp.file1}" out="${temp.file1}" style="update-air-ns.xsl" /> 
+0

你可以解釋一下xsl任務嗎?我已經嘗試了以上片段,因爲它未能取代。 – jass 2015-02-06 12:14:34

+0

我想如果你想知道'xslt'任務如何工作,你需要參考文檔。我已經解釋了爲什麼'xmltask'不能做你想做的事情,並提供了一個你想要的解決方案。 *整合*解決方案是您的工作。 – Tomalak 2015-02-06 12:20:05

+0

好的命名空間代碼+1。 – 2015-02-06 16:55:48

相關問題