2015-09-10 86 views
0

替換XML標籤下面我有XML通過XSLT映射

<?xml version="1.0" encoding="UTF-8"?> 
<ConnectInvoice type="INVOICE" xmlns="http://www.scoobydoo.com/xml/ns/ocp"> 
<FileSize id="78447274"> 
<FileHeader> 
    <FileNumber>15043662</FileNumber> 
</FileHeader> 
</FileSize> 
</ConnectInvoice> 

這就需要下面的結構轉換爲:

<?xml version="1.0" encoding="UTF-8"?> 
<ConnectInvoice type="INVOICE" xmlns="http://www.scoobydoo.com/xml/ns/ocp"> 
<Invoice id="78447274"> 
<FileHeader> 
<FileNumber>15043662</FileNumber> 
</FileHeader> 
</Invoice> 
</ConnectInvoice> 

請注意, 「ID」 該值是動態的。

如果xmlns =「http://www.scoobydoo.com/xml/ns/ocp」在XML中不存在,但XSLT在上述xml位於XML中時不執行任何操作,則XSLT映射工作正常。有人可以幫我解決我的XSLT映射

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="FileSize"> 
    <Invoice><xsl:apply-templates select="node()|@*"/></Invoice> 
</xsl:template> 
</xsl:stylesheet> 

非常感謝

更新:

如果我用下面的XSLT。 XML標記文件大小是過得去發票(這是我想要的)替換,但我也得到它(<Invoice id="78447273" xmlns:sd="scoobydoo.com/xml/ns/ocp">)命名空間,我不想

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:sd="scoobydoo.com/xml/ns/ocp"; xmlns:xsl="w3.org/1999/XSL/Transform">; 
<xsl:template match="node()|@*"> 
<xsl:copy> 
<xsl:apply-templates select="node()|@*"/> 
</xsl:copy> 
</xsl:template> 
<xsl:template match="sd:FileSize"> 
<Invoice><xsl:apply-templates select="node()|@*"/></Invoice> 
</xsl:template></xsl:stylesheet> 
+2

嘗試在線搜索「XSLT命名空間」 - 您引用的xmlns屬性聲明所有元素都在特定的命名空間中,並且您的XSLT需要反映這一點。 (我不知道確切的語法,所以不要打擾問題;我只是想指出一些問題。) – IMSoP

+0

謝謝。我更新了XSLT:<?xml version =「1.0」encoding =「UTF-8」?> 。現在它在發票後添加命名空間: user2157477

+0

請... _不要發佈代碼在評論中,_ ***它是不可讀的***。如果你對你的問題有更清楚的理解,[更新問題](http://stackoverflow.com/posts/32509696/edit)。 – Abel

回答

0

下面XSLT映射的xmlns是否工作正常= 「http://www.scoobydoo.com/xml/ns/ocp」在XML中不存在,但當上述xml位於XML中時,XSLT不執行任何操作。

實際上,XSLT做了很多。您的示例XSLT將處理所有節點並複製所有節點。但是由於沒有可用的元素映射,所以沒有其他事情會發生。

元素名稱由一個名稱空間綁定和一個本地部分組成。在你的XSLT中你只給出本地部分。

的xmlns:SD = 「scoobydoo.com/xml/ns/ocp」

正如你同時發現,你需要添加的命名空間。

,但我也越來越命名空間,它

是的,因爲它現在已經成爲結果的一部分。如果處理器遇到命名空間節點,它將添加它們。命名空間修復過程需要處理一些混亂(例如防止重複),但不能做所有事情。

你需要告訴你是(相當)肯定的是,某些命名空間前綴不需要出現在結果中(但如果需要它們時,處理器會增加他們不管),以幫助XSLT處理器:

<xsl:stylesheet version="1.0" 
    xmlns:sd="scoobydoo.com/xml/ns/ocp" 
    xmlns:xsl="w3.org/1999/XSL/Transform" 
    exclude-result-prefixes="sd"> 

(我刪除了你的分號,因爲這些是不允許的)。

我可以建議快速瀏覽basics of XML and later XSLT嗎?這隻會花費你很少的時間(你會驚訝Dimitre可以教你什麼,即使只有第一個小時是值得的!),但會爲您節省無數小時的挫折。 XML和XSLT是成熟的技術,與其他任何語言一樣,掌握它們需要一些時間。一個好的教程或(迷你)課程可以提供幫助。

+0

感謝Abel和Michael的建議。添加排除結果前綴爲我工作:) – user2157477

+0

@ user2157477不客氣,很高興我們可以幫助:) – Abel