2012-02-14 37 views
1

如何确定给定节点是否存在于我的输入xml中?如何在转换Xsl时确定节点是否存在?

如果节点存在,我想使用reportAuthor1的值,否则我会使用reportAuthor的值。我试过使用if和else失败。

<xsl:choose> 
<xsl:when test="reportAuthor1=''"> 
<xsl:value-of select="reportAuthor"/> 
</xsl:when> 
<xsl:otherwise> 
<xsl:value-of select="reportAuthor1"/> 
</xsl:otherwise> 
</xsl:choose> 

回答

5

使用not()检查节点是否不存在于所有:

<xsl:choose> 
    <xsl:when test="not(reportAuthor1)"> 
    <xsl:value-of select="reportAuthor"/> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:value-of select="reportAuthor1"/> 
    </xsl:otherwise> 
</xsl:choose> 
+0

感谢这对我有用。 – udaya726 2012-02-14 11:57:35

1

在这种特殊情况下,你还可以写

<xsl:value-of select="reportAuthor1 | reportAuthor"/> 

|返回集合的并集由该运算符的左侧和右侧的XPath查询返回,并且<xsl:value-of select="somequery"/>将向输出发送第一个节点的值由somequery返回的集合。因此,如果reportAuthor1reportAuthor都被设置,它将输出值reportAuthor1;如果只设置了reportAuthor,则会输出值reportOutput

+0

感谢您的快速回复。我尝试了以前的解决方案。我也试试这个。 – udaya726 2012-02-14 11:57:58

+0

Aaah,我的评论最初被解析器搞砸了,一定不要忘记空行!我的代码示例与Dimitre Novatchev的答案类似,尽管速度较慢(即使有'reportAuthor1'也会计算'reportAuthor')。另一方面,XSLT处理器应该足够聪明,在这种情况下不要计算'reportAuthor'。 – penartur 2012-02-14 13:25:39

+3

使用联合运算符而不是''的一个问题是,它选择XML中首先出现的任何一个,因此如果'reportAuthor'元素位于'reportAuthor1'前面,那么即使“reportAuthor1”是第一个select子句。你可以用'reportAuthor1 |来缓解这个问题reportAuthor [not(../ reportAuthor1)]',如果它没有'reportAuthor1'兄弟(xpath指定它的父节点没有'reportAuthor1'子节点),它将只选择一个'reportAuthor'元素。 – Flynn1179 2012-02-14 13:40:00

3

这可能是最简单和最短的单行XPath表达式。使用

<xsl:value-of select="reportAuthor1 | reportAuthor[not(reportAuthor1)]"/> 
相关问题