【问题标题】:XSLT <xsl: value-of> generates extra line-breaksXSLT <xsl: value-of> 生成额外的换行符
【发布时间】:2012-09-21 06:40:19
【问题描述】:

在 XSLT 中,使用 ,它会在渲染值之前生成一个换行符,在它之后生成另一个换行符。 下面是一个例子:

<xsl:when test="name(.) = 'Item'">
     "<xsl:value-of select="./Item/Data[last()]/text()"/>"
</xsl:when>

而渲染的结果是:


                                                   "
                                             09/07/2012
"

如你所见,它在结果值前后放置了两个换行符,而想要的结果是:

"09/07/2012"

原来的输入是:

这里是原始输入,抱歉。

                                      <Item>
                                         <Item>
                                            <Data>105</Data>
                                            <Data>09/07/2012</Data>
                                         </Item>
                                      </Item>

我正在 Oracle Server Bus 中执行此 XSLT

任何帮助将不胜感激。

【问题讨论】:

  • 没有输入文档是无法分辨的
  • 说这个 XSLT 在 Oracle Server Bus 中执行可能很有趣
  • 您可以尝试将其包装在

标签: xslt line-breaks value-of


【解决方案1】:

多余的空格 也可能是来自所选文本。使用normalize-space() 删除它。

<xsl:value-of select="normalize-space(./Item/Data[last()]/text())"/>

编辑 Overnuts 在引号周围使用&lt;xsl:text&gt; 是正确的,否则Xslt 处理器将保留换行符before 开头/after结束语。但是,我仍然不明白为什么引号和您的 xsl:value-of 之间会出现换行符?

我尝试了以下方法

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/xml" xml:space="default">
        <xsl:apply-templates select="*" />
    </xsl:template>

    <xsl:template match="*" xml:space="default">
        <xsl:choose>
            <xsl:when test="name(.) = 'Item'">
                <xsl:text>"</xsl:text>
                <xsl:value-of select="normalize-space(./Item/Data[last()]/text())"/>
                <xsl:text>"</xsl:text>
            </xsl:when>
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>

使用此 XML 运行时:

<xml>
    <Item>
        <Item>
            <Data>105</Data>
            <Data>09/07/2012</Data>
        </Item>
    </Item>
</xml>

产生"09/07/2012"

【讨论】:

    【解决方案2】:

    我觉得你可以试试:

    所有内容都在一行中(又快又脏):

    <xsl:when test="name(.) = 'Item'">"<xsl:value-of select="./Item/Data[last()]/text()"/>"</xsl:when>
    

    或使用这样的标签(最佳实践):

    <xsl:when test="name(.) = 'Item'">
      <xsl:text>"</xsl:text>
        <xsl:value-of select="./Item/Data[last()]/text()"/>     
      <xsl:text>"</xsl:text>
    </xsl:when>
    

    【讨论】:

    • 效果很好!每个字符串都必须在 xsl:text 标签下,如果不是,则在字符串和 xsl:value-of 的渲染结果之间添加额外的一行。
    【解决方案3】:

    可能原始 XML 源包含这些换行符(缩进),尝试类似:

    <xsl:value-of select="concat('~', normalize-space(./Item/Data[last()]/text()), '~')"/>
    

    【讨论】:

      【解决方案4】:

      也许是特定于实现的错误?

      使用 xsltproc 可以按预期完成上述所有工作,尽管裸换行符+空格+引号+日期+引号+换行符+空格的预期结果也是为了复制 /external/ 空格。所有其他示例都产生相同的 13 个字节,包括尾随换行符。

      使用 libxml 20706、libxslt 10124 和 libexslt 813 xsltproc 是针对 libxml 20701、libxslt 10124 和 libexslt 813 编译的 libxslt 10124 是针对 libxml 20701 编译的 libexslt 813 是针对 libxml 20701 编译的

      【讨论】:

        猜你喜欢
        • 2021-07-23
        • 1970-01-01
        • 2011-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-15
        相关资源
        最近更新 更多