我试图获取一个节点中的所有文本以获取以下集合并返回为一个值(而不是多个节点)。
<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函数。
答案 0 :(得分:8)
使用强>:
normalize-space(/)
评估此XPath表达式时,首先生成文档节点(/
)的字符串值,并将其作为参数提供给标准XPath函数 normalize-space()
根据定义,normalize-space()
返回其参数,其中删除了前导和尾随相邻的空白字符,以及任何临时的相邻空白字符组 - 由单个空格字符替换。
对上述XPath表达式的评估结果为:
“我喜欢外出就餐。” “这是我最喜欢的餐厅。” “我一定会回来的”
要删除引号,我们还会使用translate()
函数:
normalize-space(translate(/,'"', ''))
评估此表达式的结果是:
I love eating out. This is my favorite restaurant. I will definitely be back
最后,要将此结果包含在引号中,我们使用concat()
函数:
concat('"',
normalize-space(translate(/,'"', '')),
'"'
)
对此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('"',
normalize-space(translate(/,'"', '')),
'"'
)"/>
</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"