XSL检查是否有任何子节点具有除具有此标记的文本之外的文本

时间:2015-11-06 09:30:53

标签: xml xslt nodes

我无法检查此情况:

<xsl:template match="//DIO[not(@NOPRINT) or (@NOPRINT != '1')]"........

<xsl:when test="./text()[. != '']">
  <tr>
     <td >
       <xsl:call-template name="someTemplate"/>
     </td>
  </tr>
</xsl:when

XML就是这样:

<Dokument>
  <DIO>someText1</DIO>
  <DIO NOPRINT="1">SomeNoPrintText</DIO>
  <DIO>
      <PODDIO NOPRINT="1">
          <ITEM>10.10.2010</ITEM>
          <ITEM>10:10</ITEM>
          <ITEM>11.11.2011</ITEM>
          <ITEM>11:11</ITEM>
      </PODDIO>
      <PODDIO></PODDIO>
  </DIO>
  <DIO>
      .....
  </DIO>
</Dokument>

现在,在xsl:when test =&#34; CONDITION&#34;我需要测试DIO节点是否包含任何文本(当前条件是这样),但我只需要从没有NOPRINT = 1属性的子节点进行测试。我该怎么做?

感谢。

1 个答案:

答案 0 :(得分:0)

您可以为xsl:when

尝试此表达式
 <xsl:when test=".//text()[not(ancestor::*/@NOPRINT='1')][normalize-space()]">

严格来说,这也会检查当前DIO节点的祖先,而不仅仅是它下面的节点,但它可能会满足您的需求。

我在这里也使用normalize-space()来忽略空白节点(尽管你也可以使用xsl:strip-space元素)。

请注意,您的模板匹配也可以简化为:

<xsl:template match="//DIO[not(@NOPRINT = '1')]">

这是因为如果首先存在@NOPRINT = 1({等于1),NOPRINT将仅评估为真。如果没有这样的属性,表达式将为false,这就是你想要的。