2014-03-12 25 views
0

我有我想要變換(簡化)的XML文件:輸入XML標籤引起XSL價值的到不行

<?xml version='1.0' encoding='UTF-8'?> 
<entry xmlns="http://www.symplectic.co.uk/vivo/" xmlns:api="http://www.symplectic.co.uk/publications/api"> 
<tag>Hello, Hello.</tag> 
</entry> 

結束語我在「進入」內容標籤似乎導致這個語句在我的XSLT中存在問題。

<xsl:value-of select="$xmlfile/entry/tag"/> 

其中$ xmlFile是上述XML的fn:document輸出。我發現,從XML刪除該條目標籤時,只需修改我的XSLT:

<xsl:value-of select="$xmlfile/tag"/> 

我得到的內容(你好,你好)我期待在我的輸出。我已經證實,執行$ xmlfile的副本將返回完整的XML文件。我敢肯定,因爲我是XSL的新手,所以我沒有在語法上做正確的事情。任何意見,將不勝感激。

謝謝!

+1

如果刪除「條目」上的「xmlns」屬性,它是否工作? – David

+0

嗨,你應該能夠在你的xpath查找中使用root的'entry'元素(參見這裏的例子 - http://www.w3.org/TR/xslt20/#d5e25672)。兩個問題。 1)如何定義'$ xmlfile'變量? 2)爲什麼你不在你的xpath中使用命名空間? (您能否提供完整的xsl) –

回答

0

的問題確實與進入元素...

<entry xmlns="http://www.symplectic.co.uk/vivo/" 

的xmlns屬性在這裏實際上是一個命名空間聲明。或者說,因爲它確實聲明瞭一個前綴(如xmlns:api),它是默認的名稱空間。這意味着條目元素及其子標籤元素屬於該命名空間。

現在,你的XSLT是做這個...

<xsl:value-of select="$xmlfile/entry/tag"/> 

這是尋找進入標籤屬於沒有命名空間元素。這些與具有屬於命名空間的相同名稱的元素不同。

的解決方案是聲明命名空間,有一個前綴,在XSLT,像這樣

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:vivo="http://www.symplectic.co.uk/vivo/"> 

然後更改您的XSLT表達看起來像這樣

<xsl:value-of select="$xmlfile/vivo:entry/vivo:tag"/> 

注意實際的前綴不重要,但名稱空間url必須匹配。

+0

非常感謝您的支持!這很好,現在我對XSLT有了更多的瞭解。 :) – daniel9x

0

XPath和XSLT是名稱空間感知的。要在路徑中指定名稱空間節點,應該爲節點名稱指定一個綁定到正確名稱空間的前綴。

使用通配符,然後添加一個謂詞來只測試本地名稱是可能的,但通常是錯誤的答案。命名空間是該名稱的有意義的部分。正確使用它們。