2012-07-11 65 views
0

我使用xsl處理xsd時遇到問題。我的XSD文件開始:使用不帶名稱空間的xsl處理xsd

<schema targetNamespace="http://www.bleble.com" 
xmlns="http://www.w3.org/2001/XMLSchema"> 
<complexType name="blabla"> 
... 

所以沒有命名空間通過XSL來識別標籤。

我不能修改xsd文件,因爲有很多代碼和很多文件,所以唯一可行的方法是創建一個合適的xsl轉換文件。

我一直在嘗試添加命名空間:

xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

而不將其添加到標籤:

<complexType name="blabla"> 

,但它不是用XML標準有效。

感謝您的幫助!

+0

你需要更清楚你嘗試過的東西。你的意思是你添加了xmlns:xsd命名空間前綴聲明*到你的XSL樣式表*? 「沒有將它添加到標籤中」意味着什麼......沒有在XPath表達式中使用名稱空間前綴? 「這是無效的」是什麼意思 - 請顯示您認爲無效的代碼(在更多情況下),並告訴是什麼讓您認爲它無效。您展示的名稱空間前綴聲明肯定是格式良好的,並且不會使XSL樣式表「無效」。 – LarsH 2012-07-11 15:08:52

+0

此外,如果區分「名稱空間」和「名稱空間前綴」和「名稱空間前綴聲明」,而不是將它們全部命名爲「名稱空間」,則有關此主題的問題和解答將更容易理解。例如。當你說「沒有命名空間」時,這是不正確的。顯然你的意思是「沒有名稱空間前綴」。這可能是因爲你不熟悉命名空間聲明是如何工作的。我不會因此對你有任何缺點,但會提供這樣的建議,即一個專門研究基礎知識的小時將使生活變得更加輕鬆,並且避免以後幾小時的挫折。 – LarsH 2012-07-11 15:12:13

回答

1

你糊塗!

你說:「所以沒有名稱空間來識別xsl標籤」。但是有一個命名空間 - 命名空間是http://www.w3.org/2001/XMLSchema。沒有前綴,但前綴對XSLT無關緊要;爲了編寫XSLT處理代碼,您唯一需要知道的是名稱空間URI。例如,如果你想匹配一個複雜類型元素,你需要寫的

<xsl:template match="ajkt:complexType" xmlns:ajkt="http://www.w3.org/2001/XMLSchema"/> 

當然相當於,你通常會使用前綴比ajkt更容易識別(可能是XS或XSD),和你通常會將聲明放在xsl:stylesheet元素上,但這只是表面化妝。

+0

是的!我懂了!非常感謝! – sangtraceur 2012-07-12 05:29:32

3

這是XPath和XSLT中最常見的FAQ - 搜索「XPath中的默認命名空間」,您會發現很多好的解釋。

快速回答是,要選擇一個名稱不含空格的元素(默認名稱空間中的namespace-uri不是空字符串),您需要在XSLT代碼中將前綴綁定到名稱空間並使用所定義的前綴引用任何前綴不變的元素名稱。

在這種特殊情況下

//complexType 

選擇什麼,因爲XPath的處理器尋找一個名爲complexType是在「沒有命名空間」的元素,但文檔中的所有元素都在"http://www.w3.org/2001/XMLSchema"命名空間。

您已經綁定的前綴xsd到源XML文檔的默認命名空間 - 然後使用:

//xsd:complexType 
+0

+1有助於嘗試回答非常不清楚的問題。 – LarsH 2012-07-11 15:13:19

+0

@LarsH:不客氣:) – 2012-07-11 16:11:07