1

如何通过 br 再次加入 br 标签之间的文本节点。

这是xml代码

<div>
    text1.
    <br>
    text2.
    <br>
    text3.
    <div>ad sense code</div>
    <br>
    text4.
    <div>ad sense code</div>
    <br>
    textxx.
    <br>
</div>

我需要让所有文本节点 text2 到由 br 标签或 \n\n 加入的 textxx。

我可以使用 //div/text()[position()>1] 获取所有文本,但没有任何分隔符加入,但结果如下:

text1.text2.text3.text4.textxx.

虽然我想要这样:

text1.<br>text2.<br>text3.<br>text4.<br>textxx.<br>

只是我需要保留 br 标签。我正在使用 Perl HTML::TreeBuilder::LibXML 模块。

4

2 回答 2

1

我能够在 Perl 中做我想做的事情的解决方案是这样的:

$text = "";
$tree = HTML::TreeBuilder::LibXML->new_from_content($content);
foreach my $node ($tree->findnodes("./div/text()[position()>1]")) {
    $text .= $node->findvalue('string(.)') . "<br>";
}
$text =~ s/<br>$//g;
于 2019-08-30T06:44:05.343 回答
1

XPath 可用于 (a) 从输入文档中选择节点,或 (b) 从输入文档中的节点计算原子值,例如字符串、布尔值或数字。它永远不会 [有非常极端的例外情况] 返回输入中不存在的节点。

您希望的输出是什么意思并不完全清楚

text1.<br>text2.<br>text3.<br>text4.<br>textxx.<br> 

你在寻找这个作为一个字符串吗?还是一串散布的文本节点和元素节点?

在 XPath 3.1 中可以使用该函数将其作为字符串返回serialize(),但在 Perl 中,您只能访问古老且有限的 XPath 1.0。

将其作为一组节点返回是不可能的,因为源中不存在这些节点:源包含的文本节点具有诸如"__text1__"下划线表示空格的值,并且您想要的输出会删除空格。

您似乎在进行转换,而不仅仅是选择,因此您已经脱离了 XPath 领域并进入了 XSLT。

于 2019-08-29T23:50:06.007 回答