如何在串联节点之间(并排)插入空间?

时间:2018-07-25 08:46:13

标签: xml xslt

我的问题很容易解决。 我使用php将样式表应用于XMLDocument。

我有一些这样的XML元素:

<a>
  Lorem
  <b>ipsum</b>
  <c>dolor<d>sit amet</d></c>
</a>

dolorsit amet之间存在问题。 我想知道最简单的打印Lorem ipsum dolor sit amet的方法,每个文本节点之间都有空格。

我使用样式表的这一部分:

[...]
<xsl:value-of select="a/descendant-or-self::*" />
[...]

但是结果是Lorem ipsum dolorsit amet

我还尝试了a/descendant-or-self::*a/descendant-or-self::*/text()和模板匹配的text(),concat(' ', a/descendant-or-self::*)

我不知道子元素的名称,这就是为什么我使用descendant-or-self::*

如何以正确的单词间距将这些子元素打印为文本?

2 个答案:

答案 0 :(得分:0)

您可以使用preg_replace在每个开始标记后添加一个空格。

Echo preg_replace("/(<\w+>)/", "$1 ", $s);

输出:

<a> 
  Lorem
  <b> ipsum</b>
  <c> dolor<d> sit amet</d></c>
</a>

https://3v4l.org/rh1TP

答案 1 :(得分:0)

我对您的问题的理解是,您只需要输出文本节点,丢弃元素,同时保持单词之间用空格分隔即可。如果是这样,您可以尝试以下XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text" indent="no"/>
    <xsl:template match="/">
        <xsl:variable name="out">
            <xsl:apply-templates/>
        </xsl:variable>
        <xsl:value-of select="normalize-space($out)"/>      
    </xsl:template>


    <xsl:template match="*[node()]">
            <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="text()">
        <xsl:value-of select="concat(' ',normalize-space(.))"/>
    </xsl:template>
</xsl:stylesheet>

此工作表仅递归地降到任何节点,丢弃元素,提取文本并在它们之前添加一个空格。 normalize-space函数用一个空格替换一个或多个空格的序列。