0

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

<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

4

3 回答 3

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 来处理元素节点的内容。

于 2012-07-03T07:47:31.430 回答
0

当我们使用<xsl:value-of select="."/>then 时,它会放置上下文节点以及所有子节点的值。我不认为我们可以简单地添加一个“。” 或文本值之间的“空格”。

然而,我们可以以这样一种方式实现它,即我们遍历这些子节点,从而有机会添加一个“.”。或“空间”。

假设您的 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>

我希望这有帮助。

于 2012-07-03T04:28:34.720 回答
0

每当你需要空格时写下这个:

    <xsl:text> </xsl:text> 
于 2013-07-19T02:47:20.640 回答