检查属性的存在性及其值的非空性

时间:2010-07-21 08:22:54

标签: xml xslt xpath

<ROWS>
     <ROW oid="28439">
        <EFL eid="8" fid="27672" count="2" Name = "A : bbb">
            <MK id="3" val="0"/>
            <MK id="11" val="0578678"/>
        </EFL>
   </ROW>
</ROWS>

我有上面的xml,我希望在XSL中有以下循环

如果EFL代码中的名称属性存在并且非空那么
显示名称属性的值
否则
做某事(我知道怎么写)
ENDIF

请注意这个 IF条件将写在标记的for-each循环中。所以,这就是为什么我们不能使用匹配

由于

2 个答案:

答案 0 :(得分:2)

请参阅以下XSL。它有效,但没有测试过角落的情况。

<xsl:stylesheet version = '1.0'
 xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

 <xsl:template match="/ROWS">
     <xsl:for-each select="ROW">
         <xsl:choose>
             <xsl:when test='string-length(EFL/@Name)>0'>
                 <xsl:value-of select="EFL/@Name"/> 
             </xsl:when>

             <xsl:otherwise>I know  what to do here....</xsl:otherwise>
         </xsl:choose>
     </xsl:for-each>
 </xsl:template>

答案 1 :(得分:1)

亚历杭德罗非常正确;推断Tushar的例子:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" indent="yes"/>

  <xsl:template match="/ROWS">
    <xsl:apply-templates select="ROW" />
  </xsl:template>

  <xsl:template match="ROW[string-length(EFL/@Name)>0]">
    <xsl:value-of select="EFL/@Name" />
  </xsl:template>

  <xsl:template match="ROW">
    <xsl:text>Something else..</xsl:text>
  </xsl:template>
</xsl:stylesheet>

根据您整体问题的性质,这可能是一个更好的选择;要么完全有效。严格来说,在这个例子中,即使是匹配/ROWS的模板也是不必要的,但它可能适用于任何更复杂的模板。