与xsl:value-of类似,但在元素边界处有空格或点

时间:2012-07-03 02:43:00

标签: xslt

我敢打赌,有一种聪明,简洁的方法可以做到这一点。

<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

3 个答案:

答案 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>