2010-04-06 105 views
4

這可能是一個非常簡單的問題,但它的一個我似乎無法得到,正在撕裂我的頭髮。我有以下XML:XSL和命名空間

<?xml-stylesheet type="text/xsl" href="email.xsl"?> 
<Example xmlns=""> 
    <Name xmlns="urn:rnb.fulfilment.bus.contracts.public.exampleBookName.v1">Mark</Name> 
</Example> 

,我試圖使用以下XSLT:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
    <xsl:template match="/"> 
    <html> 
     <body> 
     <table width="90%" border="0" cellpadding="0" cellspacing="0"> 
      <tr> 
      <td> 
       <p>AUTOMATED CONFIRMATION: This confirmation email is unable to take replies. For further assistance please visit our Help pages or Contact us</p> 
       <p>Dear <xsl:value-of select="Name"/>,</p> 
       <p>Thank you for blah blah... </p> 
      </td> 
      </tr> 
     </table> 
     <xsl:apply-templates/> 
     </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

我不能讓這個名字的時候,我使用了XML飼料中的xmlns=urn:rnb.fulfilment.bus.contracts.public.exampleBookName.v1出現,當我刪除xmlns,名稱顯示正常。

是否有一些我失蹤的語法?我嘗試添加的命名空間的<xsl:stylesheet>元素:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:rpg="urn:rnb.fulfilment.bus.contracts.public.exampleBookName.v1" 
> 

然後用我給了XSLT的XPath表達式的前綴:

<xsl:value-of select="Name"/> 

但是,這也不行。誰能幫忙?提前致謝。

回答

0

或者使用謂詞和局地名稱()。例如:

<xsl:value-of select="*[local-name() = 'Name']"/> 
+0

這是一個壞主意,因爲它不僅效率低下(因爲字符串比較緩慢),而且也沒有考慮它真正應該做的命名空間。 – Lucero 2010-04-06 17:33:57

+1

...如果名稱空間相關(如果不同名稱空間需要不同的行爲)。如果XSL只是格式化您感興趣的原始XML的內容,那麼命名空間並不那麼相關,並且可以忽略。在OP示例中,名稱空間是* not *旨在保留在輸出XML中,僅保留元素的文本內容。 我不確定對性能的關注。請記住,根據XPath函數定義「* [name()= name]」等同於「name」;無論如何,爲了優化目的,編譯器可以自由地將XPath表達式重寫爲等價的表達式。 – user268396 2010-04-06 18:33:07

+0

+1這不是一個壞的或錯誤的答案,值得一個負分。它有一些含義,但它們被命名。性能參數強烈依賴於當前節點有多少個子節點以及XSLT處理器如何優化。命名空間參數在很大程度上取決於您是否在意。 ;) – Tomalak 2010-04-07 17:26:42

4

您需要在XSLT中使用相同的名稱空間,以便Name的XPath表達式匹配。

<xsl:value-of select="x:Name" xmlns:x="urn:rnb.fulfilment.bus.contracts.public.exampleBookName.v1"/> 
+2

不幸的是,這麼少的XSL教程示例包含名稱空間,這是一個常見的混淆。如果有一個與元素相關聯的名稱空間,就XSL而言,它的名稱是一個限定名稱(http://en.wikipedia.org/wiki/QName),而不是簡單名稱。 – 2010-04-06 14:35:12

+0

這不是最好的方法,因爲在'xsl:value-of'聲明名稱空間會不必要地膨脹XSL代碼。在文檔級聲明它們是要走的路。 – Tomalak 2010-04-06 14:40:32

+0

@Tomalak,它取決於在哪個範圍內使用名稱空間。如果僅在此元素上使用它,則像這樣使用它可清楚說明前綴所代表的名稱空間。當然,如果命名空間要在幾個地方使用,我也會將它移動到文檔中。 – Lucero 2010-04-06 15:30:07

6

您的聲明名稱空間爲<xsl:stylesheet>的方法已經是正確的方向。現在,所有你要做的就是使用前綴也:

<xsl:value-of select="Example/rpg:Name" /> 

我還建議一個微小的改變你的模板,以更好地反映您的輸入:

<xsl:template match="Example"> 
    <!-- ... --> 
    <xsl:value-of select="rpg:Name" /> 
</xsl:template>