2015-10-24 71 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

完美,这真的有帮助,并教我新的东西。 –