2011-10-06 95 views
2

我有一個xsl,它複製一個xml文件並重命名根標記。xsl:轉換名稱空間標記

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:stylesheet version = '1.0' 
    xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:abc="http://example.com"> 

    <xsl:output method="xml" omit-xml-declaration="yes"/> 

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

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

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

</xsl:stylesheet> 

這工作正常,但是當我去掉最後一個塊來處理一些命名空間的標籤我得到的是說,什麼是錯與複製聲明的錯誤。我如何匹配和轉換名稱空間標籤?

+0

如果您發佈示例XML和/或確切的錯誤消息,這將會很有幫助。 –

+0

不要向我們顯示有效的代碼,向我們展示不起作用的代碼,並告訴我們它是如何失敗的。我相信這個信息比「副本聲明有問題」更具體。 –

+0

錯誤消息是:XSLTProcessor :: transformToXml():運行時錯誤:xxx.xsl行zz元素副本。沒有工作的代碼只是上面沒有註釋字符'!'和' - '的代碼。但現在問題解決了,謝謝。 – stofl

回答

2

您可能會收到錯誤消息,因爲abc:set元素具有屬性,並且您的模板匹配abc:set正在生成未附加到元素的「裸」屬性。

既然你是不是複製abc:set元素(或創建一個部件),用於abc:set,當模板內的apply-templates應用模板選定abc:set/@*abc:set/node()模板匹配,則屬性匹配的身份模板並會向前複製。

可以驗證這是否是問題通過採取@*出來的select語句爲apply-templates,就像這樣:

<xsl:template match="abc:set"> 
    <xsl:apply-templates select="node()"/> 
</xsl:template> 

上面的模板將只處理的abc:set子節點。

如果您的意圖是簡單地複製abc:set,那麼您不需要該元素上的特定模板匹配。身份模板將匹配併爲您處理。

+0

非常感謝。這是問題! – stofl

2

我不知道你到底想要達到什麼目的。你的問題有點抽象。但是你的匹配屬性是正確的。但沒有差別現在是什麼:

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

做和什麼這一點:

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

一樣。如果你只想複製一切,那麼第一個模板就足夠了,包括帶有命名空間的標籤。否則,我想你需要在匹配你的命名空間標籤時做一些不同的事情。如果是這樣,那麼你不需要再次調用身份匹配模板。例如:

<!--Do something with abc:set--> 
<xsl:template match="abc:set"> 
    <setchanged name="{@name}"/> 
</xsl:template> 

請放心,這將匹配所有abc:set標記並將轉換應用於它們。

+0

謝謝,那也幫助了我。 – stofl

+0

不客氣。 – FailedDev

2

如果你真的要刪除abc:set元素,但保留子樹,它是根,然後更換

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

<xsl:template match="abc:set"> 
    <xsl:apply-templates/>  
</xsl:template> 

如果匹配的元素具有屬性,那麼您的原始代碼會導致錯誤,因爲那麼身份規則將複製它們,可能除了創建元素之外,試圖創造屬於無元素的屬性。在這種情況下,任何XSLT處理器都有義務發出錯誤信號。

替換代碼不處理匹配的abc:set元素的任何屬性。

+0

是的,那幫了我。現在它可以工作。謝謝。我認爲我需要選擇屬性。 – stofl

相關問題