2011-03-11 49 views
1

我怎样才能选择不是在div标签中的文本?使用xpath选择所有不在div元素中的文本?

例如。

<div> 
    <div>not this</div> 
    1<br/> 
    <div>not this</div> 
    1<br/> 
    1<br/> 
    <div>not this</div> 
</div> 
<div> 
    <div>not this</div> 
    2 
    <div>not this</div> 
    2 
    2 
    <div>not this</div> 
</div> 
<div> 
    <div>not this</div> 
    3 
    <div>not this</div> 
    3 
    3 
    <div>not this</div> 
</div> 

结果:{ '1/N1/N1/N', '2 2 2', '3 3 3'}

+0

你的意思不是在二级'div'吗?你发布的所有内容都在'div' –

+0

道歉,不是在二级div。谢谢! – Pete

+0

好问题,+1。查看我的答案,获得完整,简短且简单的单行XPath表达式,可以精确选择所需的节点。 :) –

回答

0
//text()[normalize-space()][../node()[not(self::text())]] 

含义任何不空白字符仅文本节点具有至少一个兄弟节点

0

使用

div/text()[string-length(normalize-space()) > 0] 

当使用提供的XML片段的父级作为上下文节点进行评估时,此表达式将选择上下文节点的任何div子级的所​​有非空白空间的文本节点子级。

这里是完整的验证

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="/*"> 
    <xsl:for-each select= 
    "div/text()[string-length(normalize-space()) > 0]"> 
    "<xsl:value-of select="."/>" 
    <xsl:text>&#xA;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

当这个变换所提供的XML片段(包裹在顶部元件成为良好的XML文档)施加:

<t> 
    <div> 
     <div>not this</div> 
     1<br/> 
     <div>not this</div> 
     1<br/> 
     1<br/> 
     <div>not this</div></div> 
    <div> 
     <div>not this</div> 
     2  
     <div>not this</div> 
     2 
     2   
     <div>not this</div></div> 
    <div> 
     <div>not this</div> 
     3  
     <div>not this</div> 
     3 
     3   
     <div>not this</div></div> 
</t> 

想要的,产生正确的结果:

" 
     1" 


    " 
     1" 


    " 
     1" 


    " 
     2  
     " 


    " 
     2 
     2   
     " 


    " 
     3  
     " 


    " 
     3 
     3   
     "