在XPath中的树上使用string()时,如何在节点之间添加空格

时间:2015-06-09 20:17:56

标签: html xslt xpath lxml

我有一个HTML树,我在根上使用'string()'查询来获取节点中的所有文本。

但是,我想在每个节点之间添加一个空格。

即。

string() 上的

'<root><div>abc</div><div>def</div></root>'成为'abcdef'

string() 上的

'<root><div>abc</div><div>def</div></root>'应该成为'abc def '

3 个答案:

答案 0 :(得分:1)

您可以尝试使用itertext()方法迭代所有文字内容:

from lxml import etree

root = etree.XML('<root><div>abc</div><div>def</div></root>')
print(' '.join(e for e in root.itertext()))

它产生:

abc def

答案 1 :(得分:1)

当XML比显示的更复杂或涉及混合内容时,不清楚您想要的输出。在XSLT 1.0中,你将不得不进行树的递归下降,涉及类似

的内容
<xsl:template match="div">
  <xsl:if test="not(position()=1)"> </xsl:if>
  <xsl:value-of select="."/>
</xsl:template>

答案 2 :(得分:1)

  

'<root><div>abc</div><div>def</div></root>'应该成为'abc def '

在XSLT 1.0中,这将完成:

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

<xsl:template match="/root">
    <xsl:for-each select="div">
        <xsl:value-of select="."/>
        <xsl:text> </xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

或者您可能想要检索所有文本节点,而不管文档结构如何。这可以通过以下方式完成:

<xsl:template match="/">
    <xsl:for-each select="//text()">
        <xsl:value-of select="."/>
        <xsl:text> </xsl:text>
    </xsl:for-each>
</xsl:template>