XPath将元素中的所有文本作为一个值,删除换行符

Ric*_*ega 8 xpath google-sheets xml-parsing

我试图获取一个节点中的所有文本以用于后续集合并返回为一个值(而不是多个节点).

<p>
   "I love eating out."
   <br>
   <br>
   "This is my favorite restaurant."
   <br>
   "I will definitely be back"
</p>
Run Code Online (Sandbox Code Playgroud)

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

"I love eating out. This is my favorite restaurant. I will definitely be back"
Run Code Online (Sandbox Code Playgroud)

我已经尝试过搜索其他问题,但找不到一些接近的问题.请注意,在当前环境中,我仅限于使用XPath查询,并且无法解析或设置任何HTML预解析.具体来说,我正在使用Google Docs中的importXML功能.

Dim*_*hev 9

用途:

normalize-space(/)
Run Code Online (Sandbox Code Playgroud)

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

根据定义,normalize-space()返回其参数,消除前导和尾随相邻的空白字符,以及任何临时的相邻空白字符组 - 由单个空格字符替换.

对上述XPath表达式的评估结果如下:

"我喜欢外出就餐." "这是我最喜欢的餐厅." "我一定会回来"

为了消除报价,我们还使用了以下translate()功能:

normalize-space(translate(/,'&quot;', ''))
Run Code Online (Sandbox Code Playgroud)

评估此表达式的结果是:

I love eating out. This is my favorite restaurant. I will definitely be back
Run Code Online (Sandbox Code Playgroud)

最后,要将此结果包含在引号本身中,我们使用以下concat()函数:

concat('&quot;',
       normalize-space(translate(/,'&quot;', '')),
       '&quot;'
       )
Run Code Online (Sandbox Code Playgroud)

对此XPath表达式的求值产生了所需的结果:

"I love eating out. This is my favorite restaurant. I will definitely be back"
Run Code Online (Sandbox Code Playgroud)

基于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>
Run Code Online (Sandbox Code Playgroud)

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

<p>
       "I love eating out."
       <br />
       <br />
       "This is my favorite restaurant."
       <br />
       "I will definitely be back"
</p>
Run Code Online (Sandbox Code Playgroud)

评估XPath表达式,并将此评估的结果复制到输出:

"I love eating out. This is my favorite restaurant. I will definitely be back"
Run Code Online (Sandbox Code Playgroud)