2014-03-13 96 views
0

我在嘗試獲取我的xml文件中的第一個非空值時遇到了問題。在XML中查找第一個非空值

下面是XML文件的樣子:

<?xml version="1.0"?> 
<ROOT> 
<Student> 
    <Student_id>TEST1</Student_id> 
    <last_printed>2014-03-11-08:00</last_printed> 
</Student> 
<Student> 
    <Student_id>TEST3</Student_id> 
    <last_printed></last_printed> 
</Student> 
<Student> 
    <Student_id>TEST4</Student_id> 
    <last_printed>2014-03-06-08:00</last_printed> 
</Student> 
</ROOT> 

我想搶到第一<last_printed>元素使用此XSLT解析出日期:

<xsl:variable name="day" select="substring-before(substring-after(substring-after(/ROOT/Student[1]/last_printed[text() != ''], '-'), '-'), '-')"/> 
<xsl:variable name="month" select="substring-before(substring-after(/ROOT/Student[1]/last_printed[text() != ''], '-'), '-')"/> 
<xsl:variable name="year" select="substring-before(/ROOT/Student[1]/last_printed[text() != ''], '-')"/> 

最終的結果是一日期顯示MMDDYYYY:

<xsl:value-of select="substring(concat($month, $day, $year, $padding), 1, 8)"/> 

我試過放置索引[1]在變量聲明學生元件上,如上圖所示,我也試圖把在這裏:

<xsl:variable name="year" select="substring-before(/ROOT/Student/last_printed[1][text() != ''], '-')"/> 

如果我不包括[1],我得到一個錯誤,指出:

序列(「2014-03-06-08:00」,「2014-03-11-08:00」)

它抓住了所有的項目不能作爲子串的第一個參數XML中的日期值。

隨着[1],它看起來像XSLT抓住它遇到的第一個元素,但它抓住一個空的元素。

我該如何抓住第一個非空元素。我認爲[text() != '']會有所幫助,但事實並非如此。

+0

您的XML無效; '''' – Utkanos

+0

@Utkanos - 抱歉,複製並粘貼錯誤。 – RXC

+2

似乎對我來說 - http://www.xmlplayground.com/lTakkR – Utkanos

回答

2

我認爲你要做得比它需要的複雜得多。試着以:

<xsl:variable name="firstDate" select="/ROOT/Student[last_printed/text()][1]/last_printed" /> 

現在你有第一個非空值,您可以繼續根據需要對其進行格式化(在文檔順序!)。

3

如何簡單地寫一個模板來匹配上述元素?

<xsl:template match="last_printed[text() and not(preceding::last_printed/text())]"> 

此認爲,具有文本節點第一last_printed元件,即,其不通過具有文本節點另一last_printed元件之前。


我無法重現你的錯誤,但這:

多個項目的順序是不允許作爲子串後的第一個參數(「2014-03-06- 08:00" ,‘2014-03-11-08:00’)

清楚地意味着你被作爲字符串函數的第一個參數供給串的序列(該消息是約substring-after,你的代碼只提到substring-before)。

所以,你必須仔細研究你的代碼,找到一個可能有多個匹配項的行。

另一件事。當使用element[text() != '']時,您認爲所有元素都有文本節點,但其中一些爲空,或者等於''

但這是不正確的。如果元素沒有文本內容,他們也沒有文本節點。因此,像

<xsl:if test="element[text() != '']"> 

返回「假」對於空元素的條件,因爲文本節點是不存在的,而不是因爲它們是空字符串。因此,

<xsl:if test="element[text()]"> 

本質上是相同的。

相關問題