正如我在評論中所說的,您不能混淆名稱空間前綴與名稱空間本身,它們是主要由URI標識的抽象實體。命名空間及其標識URI是通用的;名稱空間前綴是文檔特定的。即使在單個文檔中,不同的名稱空間前綴也可以對應相同的名稱空間(根據它們是否綁定到相同的名稱空間URI進行判斷)。它們對XSLT的重要性僅限於它們與特定名稱空間URI的關聯。
您提供具有相同本地名稱但名稱空間前綴不同的輸入元素示例。這些元素應該出現在與其各自前綴關聯的名稱空間聲明的範圍內,否則源文檔不符合XML名稱空間。此外,您依賴於元素名稱的本地部分對兩個前綴具有相同意義的事實實際上是一個聲明,您希望前綴與命名空間相關聯。
XSLT通過XPath的,相匹配的節點不是由文件字面上出現在合格的名稱,而是由他們的擴展名,這是有序對包括其可能爲空的命名空間的URI和當地他們的合格名稱的一部分。因此,輸入文檔中不同的名稱空間前綴是不相關的;重要的是每個前綴綁定的名稱空間URI。另一方面,因爲XSLT通過擴展名匹配節點,所以XSLT確實需要考慮源文檔的元素名稱所屬的非空名稱空間。您可以在XSLT 1.0中通過在樣式表中爲該名稱空間聲明自己的命名空間前綴,以使其位於涉及這些名稱的表達式的作用域中,並在表達式中使用適當的前綴名稱。
例如,給定源文件:
<d:root xmlns:d="http://some.organization.com/Namespace">
<d:DICT>
<d:noConsultationDuTeleservice>2015071717689S</d:noConsultationDuTeleservice>
<d:noAffaireDeLexecutantDesTravaux>2015/181/A</d:noAffaireDeLexecutantDesTravaux>
</d:DICT>
</d:root>
你可以寫XSLT像這樣:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="http://some.organization.com/Namespace">
<xsl:template match="ns:root">
<noConsultation>
<xsl:value-of select="ns:DICT/ns:noConsultationDuTeleservice"/>
</noConsultation>
</xsl:template>
</xsl:stylesheet>
,將工作同樣適用於使用不同前綴的輸入文檔相同的命名空間,如
<t:root xmlns:t="http://some.organization.com/Namespace">
<t:DICT>
<t:noConsultationDuTeleservice>2015071717689S</t:noConsultationDuTeleservice>
<t:noAffaireDeLexecutantDesTravaux>2015/181/A</t:noAffaireDeLexecutantDesTravaux>
</t:DICT>
</t:root>
不要混淆命名空間*前綴*和命名空間。後者由使用前綴的範圍中的前綴綁定到URI來標識。 XSLT理解這一點。因此,您的源文檔可以使用任何他們喜歡的名稱空間前綴,只要它綁定到正確的URI(您的XSLT也引用它)。這可能是你正在處理的情況,但如果不是,那麼請用[mcve]來澄清。 –
好吧,我明白了,但這對我有幫助嗎? – ericire
好的,我已經驗證了uri是類似的 但是如何玩不同的前綴? – ericire