2009-09-10 52 views
19

任何人都可以请建议返回一个包含元素的一些符合条件的子节点的连接值的字符串值的XPath表达式的格式,而忽视其他:的XPath返回符合条件的子节点的字符串连接值

<div> 
    This text node should be returned. 
    <em>And the value of this element.</em> 
    And this. 
    <p>But this paragraph element should be ignored.</p> 
</div> 

返回的值应该是单个字符串:

This text node should be returned. And the value of this element. And this. 

这是可能的单个XPath表达式吗?

谢谢。

回答

16

的在XPath 1.0:

您可以使用

/div//text()[not(parent::p)] 

捕捉到想要的文本节点。级联本身不能在XPath 1.0中完成,我建议在主机应用程序中执行它。

+3

谢谢 - 你绝对正确。我只是读了XPath参考,发现所有字符串函数都隐式地在节点集中的第一个节点上工作,因此没有办法将选择和连接组合起来。 – 2009-09-10 10:02:06

+1

在Xpath 2.0中,这很容易完成 - 请参阅我的回答:) – 2009-09-10 13:56:17

+0

可爱和优雅。对你好! – Aaron 2012-02-04 06:49:46

5

这个样子的作品:

使用的情况下/div/

text() | em/text() 

或不使用情境:

/div/text() | /div/em/text() 

如果你想Concat的前两个字符串,利用这个:

concat(/div/text(), /div/em/text()) 
+1

感谢。这是朝着正确方向迈出的重要一步。但我看不出如何连接结果。当我在对string()函数的调用中包装它时,它只返回第一个选定节点的值。 – 2009-09-10 08:25:23

+0

是的,正如您所见,我的解决方案与“正确”解决方案相同。¬¬ 您可以连接(...)节点,但是,您不会看到第三个“文本”。 试试这个: concat(/ div/text(),/ div/em/text()) – eLZahR 2009-09-10 10:17:30

6
/div//text() 

双斜线力量提取文本,无论中间节点

+0

这是一种相关且方便的知道。谢谢。 – Aaron 2012-02-04 06:50:40

+0

@欢迎光临 – Dewfy 2012-02-05 13:16:27

26

在XPath 2.0

string-join(/*/node()[not(self::p)], '')

+10

+1传统上,我将XPath 2.0答案留给您。 ;-) – Tomalak 2009-09-10 14:32:04

+0

但是在string-join()中不支持嵌套函数,如string-join(normalize-space(// a [@ class =“title”] // text())) – SIslam 2015-10-13 06:41:45

+0

@SIslam,它不是一个“嵌套函数”的问题,但只是'normalize-space()'接受一个参数 - 而不是一个序列。你可以用这个表达式来代替:'string-join(// a [@ class ='title']/normalize-space())'。当然,你必须在调用'string-join()'后添加第二个参数 – 2015-10-14 02:59:21

-2

你可以使用for-each循环以及和组装值的变量这样

<xsl:variable name="newstring"> 
    <xsl:for-each select="/div//text()"> 
     <xsl:value-of select="."/> 
    </xsl:for-each> 
    </xsl:variable> 
+1

不相关。海报询问了XQuery。 – Alberto 2016-07-27 20:11:55

0

如果你想除p以外的所有孩子,您可以尝试以下...

string-join(//*[name() != 'p']/text(), "") 

返回...

This text node should be returned. 
And the value of this element. 
And this. 
相关问题