2009-02-03 94 views
7

我有一個XSLT,用於處理特定的xml文檔。然而,現在命名空間正在引入一些,但不是我們所有的文檔。我想爲這些文檔使用相同的XSLT,但是我無法將我的樣式表修改爲命名空間不可知的。將xslt修改爲命名空間不可知的

它先前建議修改我的XPath來*[local-name()="ElementName"],但考慮到我們已經做了一個樣式表,這是非常耗費人力。另外,我知道我可以將xpath-default-namespace設置爲特定的命名空間,但如前所述,我不能簡單地將其設置爲#all或可能的命名空間列表。我正在尋找更有效的解決方案,併爲我提供撒克遜處理器的擴展功能。有任何想法嗎?謝謝。

回答

3

你有沒有考慮預處理你的XML文檔?

你可以刪除所有命名空間(注意可能發生衝突的),然後利用現有的XSL轉換處理它。

這種做法將有你不必在所有修改XSLT的優勢。它保持可讀性(* [local-name()='frob']看起來非常可怕)並且可維護。

+0

這就是我們最終要做的,以暫時緩解命名空間問題。我同意* [local-name()的東西不是很優雅。感謝您的幫助! – 2009-02-14 02:09:02

1

進一步磋商後,似乎有根本沒有簡單的方法了這一點。 XSLT必須重新設計爲與命名空間無關,或使用<xsl:stylesheet>元素上的xpath-default-namespace屬性。如果我們希望保留傳入文檔的命名空間,但仍然有多個命名空間的一個樣式表工作,那麼我們的模板就需要類似於以下形式:

<xsl:template match="*[local-name(.)='ElementName']"> 
    <xsl:element name="{local-name(.)}" xmlns="http://yourURIhere"> 
     <xsl:value-of select="."/> 
    </xsl:element> 
</xsl:template/> 

1

也許我不明白你的問題,但你不能只是讓你的模板匹配空名稱空間版本名稱空間的元素版本? - 像這樣:

<xsl:template match="ElementName | NS:ElementName" xmlns:NS="your-namespace"> 
    ... output ... 
</xsl:template> 

(通常情況下的NS前綴的聲明將被放置在樣式表元素)

這是迄今爲止最「乾淨」的版本,我 - 我一直在使用這個beeen讓單個XSLT樣式表處理所有三種RSS格式(0.91,1.0,& 2.0)。

+0

這是一個很好的解決方案,但它仍然涉及重寫複雜的模板。感謝您的幫助! – 2009-02-14 02:00:41

+0

問題是用先前已存在的名稱空間輸出 – akostadinov 2012-10-05 15:16:44