我敢打赌,有一种聪明,简洁的方法可以做到这一点。
<xsl:call-template name="item">
<xsl:with-param name="name" ><xsl:value-of select="name()" /></xsl:with-param>
<xsl:with-param name="value"><xsl:value-of select="." /></xsl:with-param>
</xsl:call-template>
请参阅xsl:value-of select="."
通常一切顺利。但有时候,当我想要一些休息时,当前节点将有子节点并且文本全部一起运行:
The Right Stuff<line/>Tom Wolfe
或
<title>The Right Stuff</title><author>Tom Wolfe</author>
在这些情况下,我喜欢“Stuff”和“Tom”之间的空格或点或其他东西。
我怎么能说xsl:value-of select="." but add a space instead of running node contents together
?
答案 0 :(得分:4)
首先,永远不要写这个:
<xsl:with-param name="name" ><xsl:value-of select="name()" /></xsl:with-param>
什么时候可以这样写:
<xsl:with-param name="name" select="name()" />
当你只需要一个简单的字符串时,它不仅冗长,而且在内存中构造临时树也非常低效。可悲的是,这个错误似乎变得越来越普遍。
xsl:value-of,当给定元素时,提取元素的字符串值,这是文本节点的串联。当人们使用常见且熟悉的标记设计来处理混合内容时,这很方便,其中剥离所有标记会留下人类可读的内容。如果XML没有被设计为使用此约定,则字符串值的此规则不太有用(这就是为什么在模式感知XPath中,不允许获取元素的字符串值,除非它是用简单内容或混合内容定义。)
在您的情况下,我建议将元素节点作为参数而不是其字符串值传递,并在调用模板中使用apply-templates来处理元素节点的内容。
答案 1 :(得分:0)
当我们使用<xsl:value-of select="."/>
时,它会放置上下文节点的值以及所有子节点。我认为我们不能简单地添加一个“。”或文本值之间的“空格”。
但是,我们可以通过迭代这样的子节点来实现它,并且有机会添加“。”。或“空间”。
我们假设您的XML如下所示。
<?xml version="1.0" encoding="UTF-8"?>
<root>
<item>
<title>The Right Stuff</title><author>Tom Wolfe</author>
</item>
</root>
然后,您可以使用以下XSL来放置“。”在子节点的值之后。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" method="xml" />
<xsl:template match="/">
<xsl:call-template name="Item">
<xsl:with-param name="name" select="name()"/>
<xsl:with-param name="value" select="//item[1]"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="Item">
<xsl:param name="name" />
<xsl:param name="value" />
<xsl:for-each select="$value/*">
<xsl:value-of select="."/>.
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我希望这会有所帮助。
答案 2 :(得分:0)
每当您需要空格时写下:
<xsl:text> </xsl:text>