2010-01-11 42 views
4

在XSLT 1.0,您可以使用函數獲取本地名稱或XML元素的namespaceURI:XSLT:獲取元素的前綴?

string local-name (node) 

string namespace-uri(node) 

但有一個標準功能得到具有限定名稱的元素的前綴

+1

我很好奇你爲什麼要這個前綴?在一天結束時,xslt引擎並不真正「理解」前綴,而是命名空間,例如,輸出文檔可能對相同的命名空間使用不同的前綴? (也可能有不同的前綴應用於相同的命名空間...) – 2010-01-11 13:47:20

+0

@Yossi我想爲StaX Parser生成一個Java存根(http://java.sun.com/javase/6/docs/api/javax /xml/stream/XMLStreamWriter.html)。這個API需要聲明名稱空間併爲qName提供一個前綴。 – Pierre 2010-01-11 14:50:01

回答

8

據我所知。如果你確定節點名稱具有前綴,您可以使用此:

substring-before(name(), ':') 

或這一點,如果你不知道:

substring-before(
    name(), 
    concat(':', local-name()) 
) 

後者表達是基於以下事實:substring-before()當搜索到的字符串未找到時返回空字符串。通過這種方式,它可以正確使用前綴爲的前綴名。

1

爲進一步細微差別,我建議您閱讀"Perils of the name() function"

例如,只有在XPath 2.0中,您才能可靠地獲取元素的前綴。在XPath 1.0中,元素使用的前綴不是數據模型的一部分。

給出下面的XML:XPath 1.0中

<my:foo xmlns:my="http://example.com" xmlns:my2="http://example.com"/> 

名稱()函數可以合法地在回報 「我:富」 或 「MY2:富」。但在XPath 2.0中,它必須返回「my:foo」

2

一般來說,如果你關心一個元素的前綴,那麼你做錯了。你應該只關心它屬於哪個命名空間。

在您的評論中,您注意到您正在與之交談的API要求您提供一個名稱空間和一個名稱空間前綴。確實如此,但是您鏈接的API實際上並不關心名稱空間前綴是什麼 - 事實上,如果您不提供它,它將隨機生成一個名稱空間前綴。

如果您要生成完整的XML文檔,那麼如果您有名稱空間URI的前綴一對一映射,它使輸出更容易理解。但是,這些前綴是什麼並不重要。