我的问题很容易解决。 我使用php将样式表应用于XMLDocument。
我有一些这样的XML元素:
<a>
Lorem
<b>ipsum</b>
<c>dolor<d>sit amet</d></c>
</a>
在dolor
和sit 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::*
如何以正确的单词间距将这些子元素打印为文本?
答案 0 :(得分:0)
您可以使用preg_replace在每个开始标记后添加一个空格。
Echo preg_replace("/(<\w+>)/", "$1 ", $s);
输出:
<a>
Lorem
<b> ipsum</b>
<c> dolor<d> sit amet</d></c>
</a>
答案 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
函数用一个空格替换一个或多个空格的序列。