在XSLT 1.0,您可以使用函數獲取本地名稱或XML元素的namespaceURI:XSLT:獲取元素的前綴?
string local-name (node)
和
string namespace-uri(node)
但有一個標準功能得到具有限定名稱的元素的前綴?
在XSLT 1.0,您可以使用函數獲取本地名稱或XML元素的namespaceURI:XSLT:獲取元素的前綴?
string local-name (node)
和
string namespace-uri(node)
但有一個標準功能得到具有限定名稱的元素的前綴?
據我所知。如果你確定節點名稱具有前綴,您可以使用此:
substring-before(name(), ':')
或這一點,如果你不知道:
substring-before(
name(),
concat(':', local-name())
)
後者表達是基於以下事實:substring-before()
當搜索到的字符串未找到時返回空字符串。通過這種方式,它可以正確使用前綴爲和的前綴名。
爲進一步細微差別,我建議您閱讀"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」。
一般來說,如果你關心一個元素的前綴,那麼你做錯了。你應該只關心它屬於哪個命名空間。
在您的評論中,您注意到您正在與之交談的API要求您提供一個名稱空間和一個名稱空間前綴。確實如此,但是您鏈接的API實際上並不關心名稱空間前綴是什麼 - 事實上,如果您不提供它,它將隨機生成一個名稱空間前綴。
如果您要生成完整的XML文檔,那麼如果您有名稱空間URI的前綴一對一映射,它使輸出更容易理解。但是,這些前綴是什麼並不重要。
我很好奇你爲什麼要這個前綴?在一天結束時,xslt引擎並不真正「理解」前綴,而是命名空間,例如,輸出文檔可能對相同的命名空間使用不同的前綴? (也可能有不同的前綴應用於相同的命名空間...) – 2010-01-11 13:47:20
@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