2013-05-08 38 views
0

我試圖在XSLT 1.0做以下命令:串起多個XSLT字符串操作起來

<xsl:element name="{substring-before(concat('dc:',substring-after(name(),'.')),'.')}"> 
    <xsl:apply-templates/> 
</xsl:element> 

我上線運行時錯誤,但如果我上一行刪除子,前命令有用。我猜我在某處發生了一個語法錯誤,但不知道是什麼(因爲我是xslt的新手)。任何指針,我做錯了什麼?我想問題可能是什麼子字符串 - 返回前如果沒有找到針字符串?

謝謝。

+0

如果您可以提供運行時錯誤消息,這將有所幫助。 – 2013-05-08 17:03:12

+0

另外,元素的名稱是什麼,包括任何名稱空間前綴,您當前的位置? (即「name()」返回什麼?) – 2013-05-08 17:26:34

+0

這個字符串操作的目的是什麼?除非原始節點名稱中有兩個句點,否則最終結果將爲空白。 – JLRishe 2013-05-08 18:03:37

回答

0

如果$ haystack不包含$ needle的實例,則substring-before($ haystack,$ needle)將返回空字符串。

你還沒有犯過語法錯誤,但你肯定犯了一個邏輯錯誤。讓我們繼續努力吧。假設當前元素被命名爲ns:abcns:def.ghins:jkl.mno.pqr之一。

  1. 表達式substring-after(name(),'.')返回'','ghi'或'mno.pqr'。

  2. concat表達式將dc:添加到開頭,因此我們有'dc:','dc:ghi'或'dc:mno.pqr'。

  3. 完整表達式在連接結果中搜索'。'並在'。'之前返回子字符串。或空字符串,所以我們爲我們的三個測試用例獲得'',''和'pqr'。

如果你猜,substring-beforesubstring-after返回整個字符串,如果沒有匹配的話,那麼現在你知道了真相。

+0

是的,這是我的問題,我檢查並注意到它返回一個空字符串,因此運行時錯誤,因爲元素不能是一個空字符串。非常好的解釋,肯定會幫助那些可能會犯同樣邏輯錯誤的人。 – user5013 2013-05-08 21:47:33