2015-10-24 68 views
0

我有一個xslt,需要和格式化一個XML,在我的代碼我想編程邏輯萬一鏈接元素不存在。在這種情況下,我只想寫出沒有鏈接的標題。但我沒有得到它的工作,也許有更好的方法。請參閱代碼片段:如何使用如果邏輯在xslt

編輯:添加了XML,如果是空白和相同的測試,因爲我只是不知道如何解決。

<td> 
 
    <xsl:if test="link="> 
 
    <!-- Look for link, target to blank, the link text is the tittle pulled from xml --> 
 
    <a href="{link}" target="_blank"> 
 
     <xsl:value-of select="title" /> 
 
    </a> 
 
    </xsl:if> 
 

 
    <xsl:if test="link="> 
 
    <xsl:value-of select="title" /> 
 
    </xsl:if> 
 
</td>

XML片段顯示數據是如何進來。

<movies> 
 

 
    <!-- 1 --> 
 
    <movie> 
 
    <movieID>0108052</movieID> 
 

 
    <title>Schindler's List</title> 
 

 
    <director>Steven Spielberg</director> 
 

 
    <year>1993</year> 
 

 
    <genre>Biography,</genre> 
 
    <genre>Drama,</genre> 
 
    <genre>History</genre> 
 

 

 
    <link>http://www.imdb.com/title/tt0108052/</link> 
 
    </movie> 
 
    <movies>

+0

你的輸入是什麼樣的?我期望'link [=]'是一個元素或屬性,而不是文本文本。(順便說一下,你的嘗試不起作用的原因是因爲你做了兩次完全相同的測試。) – usr2564301

+0

@Jongware我在那裏添加了一些信息,希望它有幫助。 –

回答

2

xsl:if test=..語句的語法是錯誤的。這裏不是字符串測試,而是元素測試,因此它會嘗試找到名爲<link=>的元素 - 這實際上是XML中無效的元素名稱。

你可以簡單的測試(沒有雙關語意)與

<xsl:if test="link">there is a child element called "link"</xsl:if> 

<xsl:if test="not(link)">there is no child element called "link"</xsl:if> 

..但XSLT很迂,所以你仍然可能無法得到你想要。假設你的輸入文件包含空<link>元素,如

<link></link> 

或(更陰險)

<link> 
</link> 

- 這是「更陰險」,因爲該元素實際上包含的數據。

所以一個更好的測試是針對元素<link>它是否實際上包含文本數據,而不是隻有空白的存在。幸運的是,您可以使用normalize-space函數首先丟棄所有空格,然後測試是否還有剩餘內容。下面的模板做的是:

<xsl:template match="movie"> 
<td> 
    <xsl:if test="normalize-space(link)"> 
    <!-- Look for link, target to blank, the link text is the tittle pulled from xml --> 
    <a href="{link}" target="_blank"> 
     <xsl:value-of select="title" /> 
    </a> 
    </xsl:if> 

    <xsl:if test="not(normalize-space(link))"> 
    <xsl:value-of select="title" /> 
    </xsl:if> 
</td> 
</xsl:template> 

如果你有一個以上的選項來測試對,你可以把它們連在兩個<xsl:if>序列,但你必須記住要插入的所有選項,以便在報表,或者你可能會得到雙重輸出title。更通用的解決方案是使用的選項列表:

<xsl:template match="movie"> 
<td> 
    <xsl:choose> 
    <xsl:when test="normalize-space(link)"> 
     <!-- Look for link, target to blank, the link text is the tittle pulled from xml --> 
     <a href="{link}" target="_blank"> 
     <xsl:value-of select="title" /> 
     </a> 
    </xsl:when> 

    <xsl:otherwise> 
     <xsl:value-of select="title" /> 
    </xsl:otherwise> 
    </xsl:choose> 
</td> 
</xsl:template> 

您可以添加<xsl:when>線每一種情況下,只有當他們沒有匹配,它會自動通過降低到默認otherwise行動,這只是寫出標題。

+1

完美,這真的有幫助,並教我新的東西。 –