Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 如何在XPath中的树上使用string()时在节点之间添加空格_Html_Xslt_Xpath_Lxml - Fatal编程技术网

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

Html 如何在XPath中的树上使用string()时在节点之间添加空格,html,xslt,xpath,lxml,Html,Xslt,Xpath,Lxml,我有一个HTML树,其中我使用根目录上的'string()'查询从节点获取所有文本 但是,我想在每个节点之间添加一个空间 即 'abcdef'上的string()将变成'abcdef' 'abcdef'上的string()应该变成'abc def'您可以尝试使用itertext()方法,该方法迭代所有文本内容: from lxml import etree root = etree.XML('<root><div>abc</div><div>de

我有一个HTML树,其中我使用根目录上的
'string()'
查询从节点获取所有文本

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

'abcdef'
上的
string()
将变成
'abcdef'


'abcdef'
上的
string()
应该变成
'abc def'

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

from lxml import etree

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

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

from lxml import etree

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

当XML比显示的更复杂时,或者当它包含混合内容时,您想要什么输出尚不清楚。在XSLT1.0中,必须对树进行递归下降,包括

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

当XML比显示的更复杂时,或者当它包含混合内容时,不清楚您想要什么输出。在XSLT1.0中,必须对树进行递归下降,包括

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

'abcdef'
应该变成
'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>

'abcdef'
应该变成
'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>


您使用的是XSLT 1.0还是XSLT 2.0?@TimC我使用的是Python中的lxml包。在它的文档中:“lxml以符合标准的方式通过libxml2和libxslt支持XPath 1.0、XSLT 1.0和EXSLT扩展。”你的问题不清楚。请发布输入XML和预期输出的简短示例。还要澄清为什么这里需要string()函数。@michael.hor257k我不知道如何在不重复我自己或使用其他词来表达同样的意思的情况下更清楚地表达出来。这里有输入、当前输出和期望的输出示例。虽然我添加了一些
root
节点,但这可能会有所帮助?您使用的是XSLT1.0还是XSLT2.0?@TimC我使用的是Python中的lxml包。在它的文档中:“lxml以符合标准的方式通过libxml2和libxslt支持XPath 1.0、XSLT 1.0和EXSLT扩展。”你的问题不清楚。请发布输入XML和预期输出的简短示例。还要澄清为什么这里需要string()函数。@michael.hor257k我不知道如何在不重复我自己或使用其他词来表达同样的意思的情况下更清楚地表达出来。这里有输入、当前输出和期望的输出示例。虽然我添加了一些
root
节点,但这可能会有所帮助吗?这确实让我想知道xpath到底是什么。追溯到某个cython,但不确定它是否只是连接文本+尾部。这确实让我想知道xpath到底是什么。追溯到某个cython,但不确定它是否只是连接文本+尾部。