8

我正在尝试获取节点中的所有文本以获取以下集合并作为一个值(而不是多个节点)返回。

<p>
   "I love eating out."
   <br>
   <br>
   "This is my favorite restaurant."
   <br>
   "I will definitely be back"
</p>

我正在使用 '/p' 并获得所有结果,但它返回换行符。同样尝试 '/p/text()' 会导致将每个标签之间的每个文本作为单独的返回值。理想的回报是——

"I love eating out. This is my favorite restaurant. I will definitely be back"

我试过搜索其他问题,但找不到很接近的东西。请注意,在当前环境中,我仅限于使用 XPath 查询,并且无法解析或设置任何 HTML 预解析。具体来说,我在 Google Docs 中使用 importXML 函数。

4

1 回答 1

10

使用

normalize-space(/)

当计算此 XPath 表达式时,首先生成文档节点 () 的字符串值,并将/其作为参数提供给标准 XPath 函数normalize-space()

根据定义,normalize-space()返回其参数,消除了前导和尾随的相邻空白字符,并且任何中间的此类相邻空白字符组 - 替换为单个空格字符。

对上述 XPath 表达式的求值结果为:

“我喜欢出去吃饭。” “这是我最喜欢的餐厅。” “我一定会回来”

为了消除引号,我们另外使用了translate()函数

normalize-space(translate(/,'&quot;', ''))

评估此表达式的结果是

I love eating out. This is my favorite restaurant. I will definitely be back

最后,为了让这个结果用引号括起来,我们使用concat()函数

concat('&quot;',
       normalize-space(translate(/,'&quot;', '')),
       '&quot;'
       )

这个 XPath 表达式的评估产生了想要的结果

"I love eating out. This is my favorite restaurant. I will definitely be back"

基于 XSLT 的验证

<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="/">
  <xsl:value-of select=
   "concat('&quot;',
           normalize-space(translate(/,'&quot;', '')),
           '&quot;'
           )"/>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时(更正为格式正确):

<p>
       "I love eating out."
       <br />
       <br />
       "This is my favorite restaurant."
       <br />
       "I will definitely be back"
</p>

对 XPath 表达式求值,并将该求值的结果复制到输出中:

"I love eating out. This is my favorite restaurant. I will definitely be back"
于 2012-06-13T03:19:05.920 回答