2014-09-10 43 views
0

我是新來的XSL和使用版本1.0<xsl:variable name =「pubDate」select =「publicationDate」/>的返回類型,節點集還是字符串?

下面是一些XML源

<?xml version="1.0"?> 
<catalog> 
    <cd> 
     <title>Empire Burlesque</title> 
     <artist>Bob Dylan</artist> 
     <company>Columbia</company> 
     <publicationDate>03/31/1985</publicationDate> 
    </cd> 
</catalog> 

從上面的XML內容,我將在XSL代碼varialbe通過

<xsl:variable name="pubDate" select="//publicationDate" /> 

我以爲變量'pubDate'應該包含節點集,因爲'// publicationDate',但是後來我意識到 可以應用String函數,如subString($ pubDate,1,4),它暗示'pubDate'也是一個String 。

是一些自動類型轉換還是其他?

回答

2

在XSLT 1.0 $pubDate是一個節點集。如果要在需要字符串值作爲參數的函數中引用它,它將使用節點集中第一個節點的字符串值。也就是說,它會得到節點和所有後代節點的文本值。所以,如果你的第一個節點實際上是這樣的:

<publicationDate><mm>03</mm><dd>31</dd><yy>1985</yy></publicationDate> 

然後substring($pubDate, 1, 4)仍將輸出0331。儘管如此,XSLT 2.0中的事情會有所不同。它將包含一個序列,如果你嘗試了相同的子字符串表達式,你會得到一個錯誤「不允許多個項目的序列作爲子字符串()的第一個參數」

編輯:現在,如果你已經完成這...

<xsl:variable name="pubDate"> 
     <xsl:copy-of select="//publicationDate" /> 
    </xsl:variable> 

然後$pubDate包含一個「結果樹片段」。您仍然可以在字符串函數中使用它,但在這種情況下,它實際上會使用整個結果樹片段的字符串值。

+0

謝謝。所以變量的實際值/類型取決於函數的上下文,對吧?此外,「結果樹片段」是一個2.0的東西,或適用於1.0和2.0? – dunfa 2014-09-10 20:54:34

+0

變量的類型保持不變,無論它如何使用。在這種情況下它仍然是一個節點集。它只是該函數可以從中提取字符串值,但該變量仍然是一個節點集!結果樹片段僅適用於XSLT 1.0(請參閱http://www.xml.com/lpt/a/951) – 2014-09-10 22:24:41

相關問題