XML:检查两个节点之间是否存在任何内容

时间:2010-03-25 20:03:00

标签: xml xslt xpath

我需要找出两个节点之间是否存在任何问题。我的XML看起来像这样:

<event value1="1" value2="2" value3="3" info="some info here">
          Line 1.<lb/>
          Line 2.<lb/><lb/>
          Line 3.<lb/>
          Line 4.<lb/>
</event>

我的目标是使用XSLT将<lb/>节点转换为<br/> HTML标记。但是还有一个额外的要求。如果有一个<lb/> 直接跟随另一个<lb/>,我只想输出一个 <br/>

我的XSLT看起来像这样:

 <xsl:template match="lb">
    <xsl:if test="not(preceding-sibling::lb[1])">
       <br/>
    </xsl:if>
 </xsl:template>

上面的XSLT的问题在于它仅对第1行正常工作,因为忽略了两个节点之间的文本。

也许有人可以提供帮助。

3 个答案:

答案 0 :(得分:3)

修改:另一个更有效的方法是:

<xsl:template match="lb">
    <xsl:if test="following-sibling::node()[1][not(self::lb)]">
        <br/>
    </xsl:if>
</xsl:template>

试试这个:

 <xsl:template match="lb">
   <xsl:if test="generate-id()=generate-id(preceding-sibling::text()[1]/following-sibling::lb[1])">
     <br/>
   </xsl:if>
 </xsl:template>

基本上,这会检查您是否位于前一个文本同级节点的第一个<lb/>,这也意味着它只会在某些文本之后添加<br/>,但如果<lb/>是{{1}}则不会在父标记的开头。

答案 1 :(得分:3)

您正在寻找类似的内容:

<!-- per default, <lb> gets removed (empty template)... -->
<xsl:template match="lb" />

<!-- ...unless it is directly preceded by a non-blank text node -->
<xsl:template match="lb[
  normalize-space(preceding-sibling::node()[1][self::text()]) != ''
]">
  <br />
</xsl:template>

它处理可能连续发生的任意数量的<lb/>个节点。

必须仍然定义跟随元素(不是文本节点)的<lb/>个节点的行为。目前他们将被删除。如果你想保留它们,请为它们写一个合适的模板。

答案 2 :(得分:1)

此转化

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="lb"/>

 <xsl:template match=
  "lb[not(following-sibling::node()[1][self::lb])]">
  <br />
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档

<event value1="1" value2="2" value3="3" info="some info here">
          Line 1.<lb/>
          Line 2.<lb/><lb/>
          Line 3.<lb/>
          Line 4.<lb/>
</event>

产生想要的结果

<event value1="1" value2="2" value3="3" info="some info here">
          Line 1.<br/>
          Line 2.<br/>
          Line 3.<br/>
          Line 4.<br/>
</event>

请注意

  1. 使用和覆盖身份转换

  2. 默认情况下如何删除<lb>元素。

  3. 如何以更特殊的方式处理一组相邻兄弟<lb>节点中的最后一个<lb>元素 - 由<br />元素替换。