2011-10-04 53 views
3

當處理命名空間的版本問題,我有一個XSLT文件的樣子:如何使用XSL命名空間別名

<?xml version="1.0" encoding="utf-8"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
     xmlns:MM="http://schemas.microsoft.com/sqlserver/ManagementModel/Serialization/2011/09" 
     xmlns:RE="http://schemas.microsoft.com/sqlserver/RelationalEngine/Serialization/2011/09" 
     xmlns:dac="urn:dacFunctions" 
     exclude-result-prefixes="msxsl"> 
    <xsl:output method="xml" indent="yes"/> 

的問題是,我們可能將命名空間從http://schemas.microsoft.com/sqlserver/ManagementModel/Serialization/2011/09 to http://schemas.microsoft.com/sqlserver/ManagementModel/Serialization/2011/10

新個XML,那麼改變舊的xslt無法在不更改標題的情況下處理新的xml文件。我想知道我們是否可以有一個聰明的方法來允許一個xlst處理所有版本的命名空間。

+0

看到這個[鏈接](http://stackoverflow.com/questions/16963316/how當命名空間是動態的時候,這個命名空間在xslt文件中,如果它對你有用的話。 – RaoPotla

回答

1

的問題是,我們可以從 http://schemas.microsoft.com/sqlserver/ManagementModel/Serialization/2011/09 命名空間更改爲 http://schemas.microsoft.com/sqlserver/ManagementModel/Serialization/2011/10

新個XML,那麼舊的XSLT無法處理的新的XML文件 沒有改變標題。我不知道我們是否能有一個聰明的辦法來 允許一個XLST來處理命名空間的所有版本。

這裏沒有一個通用的方法,但是如果在某種程度上有一定的侷限性,就有可能。

假設

  1. 屬於命名空間"http://schemas.microsoft.com/sqlserver/ManagementModel/Serialization/2011/09"所有名稱的前綴爲"mm:"

  2. 前綴"mm:"只用在與同一個命名空間關聯。

可以實現namespace-uri可以獨立以下列方式

在任何XPath表達式是指一個域名(比如someName)爲:

*[starts-with(name(), 'mm:')] 

,並在罕見情況下,當你可能在這個命名空間(不是屬性的建議的做法)屬性名稱:

@*[starts-with(name(), 'mm:')] 
0

我的首選方法,這是對預處理的文件(通常情況下,與另一個XSLT轉換),所以他們使用一致的命名空間。預處理樣式表非常簡單,通過這種方式可以避免使用大量複雜條件代碼混淆主樣式表。另外,預處理代碼變得完全可重用;你可以在任何管道中使用它。

如果您需要多一點的性能,你可以做的XML解析器和變壓器,在那裏將花費幾乎爲零之間插入的SAX過濾預處理。

(我也建議人們避免包裝的版本信息爲命名空間URI,但沒有告訴微軟...)