XSL。仅返回第一个非空元素

时间:2015-07-24 04:45:30

标签: xslt

XML:

<?xml version="1.0" encoding="utf-8"?>
    <NewDataSet>
      <inc_incident>
        <inc_assessmentvitalsigns>
          <DateVitalSignsTaken>2013-10-06T20:23:36</DateVitalSignsTaken>
          <SBP>10</SBP>
          <DBP>20</DBP>
          <inc_cardiacrhythm>
            <CardiacRhythm></CardiacRhythm>
          </inc_cardiacrhythm>
        </inc_assessmentvitalsigns>
        <inc_assessmentvitalsigns>
          <DateVitalSignsTaken>2013-10-06T20:24:36</DateVitalSignsTaken>
          <SBP>0</SBP>
          <DBP>0</DBP>
          <inc_cardiacrhythm>
            <CardiacRhythm>Asystole</CardiacRhythm>
          </inc_cardiacrhythm>
        </inc_assessmentvitalsigns>
        <inc_assessmentvitalsigns>
          <DateVitalSignsTaken>2013-10-06T20:25:36</DateVitalSignsTaken>
          <SBP>0</SBP>
          <DBP>0</DBP>
          <inc_cardiacrhythm>
            <CardiacRhythm>Sinus Tachycardia</CardiacRhythm>
          </inc_cardiacrhythm>
        </inc_assessmentvitalsigns>
      </inc_incident>
    </NewDataSet>

XSL :(仅限代码段)

<fo:table-row>
 <fo:block>
  <xsl:for-each select="inc_assessmentvitalsigns">
   <xsl:if test="inc_cardiacrhythm/cardiacRhythm !=''">
    <xsl:for-each select="inc_cardiacrhythm/CardiacRhythm">
       <fo:inline font-family="Verdana, Arial, sans-serif" font-size="9pt">
        <xsl:apply-templates />
       </fo:inline>
  </xsl:for-each>
   </xsl:if>
    </xsl:for-each>
 </fo:block>
</fo:table-row>
   .......
<fo:table-row>
</fo:table-row>

我使用APACHE FOP生成包含表格和行的PDF文档。

问题是如何仅返回CardiacRhythm的第一个非空元素?如果我使用

xsl:value-of
 select

然后该表的下一行被截断。我无法解决这个问题。谢谢你的帮助。

xsl:

的结果
  
    

AsystoleSinus Tachycardia

  

3 个答案:

答案 0 :(得分:1)

要获取其中包含一些字符数据的第一个子元素CardiacRhythm,我更喜欢像CardiacRhythm[text()[string-length(.) gt 0]][1]这样的XPath表达式。这意味着:转到所有名为CardiacRhythm的孩子,这些孩子至少有一个文本节点,其字符串长度大于零。然后从这些中选择第一个。

答案 1 :(得分:0)

会这样做:

<xsl:for-each select="inc_assessmentvitalsigns[inc_cardiacrhythm/cardiacRhythm !=''][1]">
    <fo:inline font-family="Verdana, Arial, sans-serif" font-size="9pt">
        <xsl:apply-templates select="inc_cardiacrhythm/cardiacRhythm" />
    </fo:inline>
</xsl:for-each>

答案 2 :(得分:0)

您可以使用以下XPath选择器仅获取第一个非空<cardiacRhythm>元素:

(inc_cardiacrhythm/cardiacRhythm[normalize-space()])[1]

请注意,包含空格的元素也仅被视为空元素,上述XPath不会选择这些元素。