在XSLT中生成一个新行

时间:2009-04-06 21:02:41

标签: xslt

我想在XSLT中为文本输出生成换行符。有什么想法吗?

13 个答案:

答案 0 :(得分:223)

以下XSL代码将生成newline(换行符)字符:

<xsl:text>&#xa;</xsl:text>

对于carriage return,请使用:

<xsl:text>&#xd;</xsl:text>

答案 1 :(得分:48)

我喜欢这样做的方法如下:

<xsl:stylesheet>

<xsl:output method='text'/>

<xsl:variable name='newline'><xsl:text>
</xsl:text></xsl:variable>

<!-- note that the layout there is deliberate -->

...

</xsl:stylesheet>

然后,每当您想要输出换行符(可能在csv中)时,您可以输出如下内容:

<xsl:value-of select="concat(elem1,elem2,elem3,$newline)" />

我从xml输入输出sql时使用过这种技术。实际上,我倾向于为逗号,引号和换行创建变量。

答案 2 :(得分:45)

在xsl:output标记上包含属性Method =“text”,并在适当的位置在XSL的文字内容中包含换行符。如果您希望保持XSL的源代码整洁,请使用您想要换行的实体&#10;

答案 3 :(得分:26)

您可以使用:<xsl:text>&#10;</xsl:text>

参见示例

<xsl:variable name="module-info">
  <xsl:value-of select="@name" /> = <xsl:value-of select="@rev" />
  <xsl:text>&#10;</xsl:text>
</xsl:variable>

如果你在文件中写这个。

<redirect:write file="temp.prop" append="true">
  <xsl:value-of select="$module-info" />
</redirect:write>

此变量将生成一个新行infile:

commons-dbcp_commons-dbcp = 1.2.2
junit_junit = 4.4
org.easymock_easymock = 2.4

答案 4 :(得分:5)

恕我直言,不再需要@Florjon给出的信息。也许还有一些小细节可以理解为什么它有时候对我们不起作用。

首先,&#xa中的&#10(十六进制)或<xsl:text/>(十进制)将始终有效,但您可能看不到它。

  1. HTML标记中没有换行符。使用简单的<br/>会很好。否则你会看到一个空白区域。从浏览器中查看源代码将告诉您实际发生了什么。但是,有些情况下您会预期此行为,尤其是如果使用者不是直接浏览器。例如,您希望创建一个HTML页面,并在将其提供给浏览器之前,使用空行和标识很好地查看其结构。
  2. 请记住您需要使用disable-output-escaping的位置以及不需要的位置。以下示例我必须从另一个创建xml并从样式表中声明其DTD。
  3. 第一个版本确实转义了字符(xsl:text的默认值)

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:output method="xml" indent="yes" encoding="utf-8"/>
    
        <xsl:template match="/">
            <xsl:text>&lt;!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd"&gt;&#xa;&#xa;&#xd;</xsl:text>
            <xsl:copy>
                <xsl:apply-templates select="*" mode="copy"/>
            </xsl:copy>
        </xsl:template>
        <xsl:template match="@*|node()" mode="copy">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()" mode="copy"/>
            </xsl:copy>
        </xsl:template>
    
    </xsl:stylesheet>
    

    以下是结果:

    <?xml version="1.0" encoding="utf-8"?>
    &lt;!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd"&gt;
    
    &#13;<Subscriptions>
        <User id="1"/>   
    </Subscriptions>
    

    好吧,它完成了我们的期望,完成了转义,以便我们使用的字符正确显示。根节点内的XM​​L部分格式由ident="yes"处理。 但仔细观察,我们发现换行符&#xa未按原样进行转义和翻译,执行双线换行!我对此没有解释,很高兴知道。任何人?

    第二个版本没有逃避角色,因此他们正在制作他们的意图。所做的改变是:

    <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd"&gt;&#xa;&#xa;&#xd;</xsl:text>
    

    以下是结果:

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">
    
    <Subscriptions>
        <User id="1"/>   
    </Subscriptions>
    

    那没关系。 cr和lf都被正确渲染。

    1. 不要忘记我们在讨论nl,而不是crlfnl=lf)。我的第一次尝试是仅使用cr:&#xd,而输出xml由DOM正确验证。
    2. 我正在查看损坏的xml:

      <?xml version="1.0" encoding="utf-8"?>
      <Subscriptions>riptions SYSTEM "Subscriptions.dtd">
          <User id="1"/>   
      </Subscriptions>
      

      DOM解析器忽略了控制字符,但渲染没有。在我意识到我没有看到这个有多傻之前,我花了很长时间才碰到头!

      为了记录,我确实在体内使用了一个变量,两个CRLF都是100%确定它可以在任何地方使用。

答案 5 :(得分:3)

我添加了您在此处看到的DOCTYPE指令:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [
  <!ENTITY nl "&#xa;">
]>
<xsl:stylesheet xmlns:x="http://www.w3.org/2005/02/query-test-XQTSCatalog"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="2.0">

这允许我使用&nl;代替&#xa;在输出中生成换行符。与其他解决方案一样,这通常放在<xsl:text>标记内。

答案 6 :(得分:2)

我发现<xsl:text>中的文字换行符与使用&#xA;的文字换行符之间存在差异。

虽然文字换行在我的环境中运行良好(使用Saxon和默认的Java XSLT处理器),但是当它在.NET环境中运行的另一个组执行时,我的代码失败了。

更改为实体(&#xA;)使我的文件生成代码在Java和.NET上一致运行。

此外,文字换行很容易被IDE重新格式化,并且当文件由“不知道”的人维护时,可能会无意中丢失。

答案 7 :(得分:2)

根据我的经验,我注意到生成一个新行 INSIDE 一个<xsl:variable>子句不起作用。 我试图做一些像:

<xsl:variable name="myVar">
  <xsl:choose>
    <xsl:when test="@myValue != ''">
      <xsl:text>My value: </xsl:text>
      <xsl:value-of select="@myValue" />
      <xsl:text></xsl:text> <!--NEW LINE-->
      <xsl:text>My other value: </xsl:text>
      <xsl:value-of select="@myOtherValue" />
    </xsl:when>
  </xsl:choose>
<xsl:variable>

<div>
  <xsl:value-of select="$myVar"/>
</div>

我试图放入“新行”(空<xsl:text>节点)的任何东西都不起作用(包括本页中的大多数更简单的建议),更不用说HTML刚赢了在那里工作,所以最终我不得不将它拆分为2个变量,在<xsl:variable>范围之外调用它们并在它们之间加上一个简单的<br/>,即:

<xsl:variable name="myVar1">
  <xsl:choose>
    <xsl:when test="@myValue != ''">
      <xsl:text>My value: </xsl:text>
      <xsl:value-of select="@myValue" />
    </xsl:when>
  </xsl:choose>
<xsl:variable>

<xsl:variable name="myVar2">
  <xsl:choose>
    <xsl:when test="@myValue != ''">
      <xsl:text>My other value: </xsl:text>
      <xsl:value-of select="@myOtherValue" />
    </xsl:when>
  </xsl:choose>
<xsl:variable>

<div>
  <xsl:value-of select="$myVar1"/>
  <br/>
  <xsl:value-of select="$myVar2"/>
</div>

是的,我知道,这不是最复杂的解决方案,但它有效,只是与XSL分享我的挫折经验;)

答案 8 :(得分:2)

您可以尝试

For the month of: January

             EXP                                  FEE

TRANSID     EXPID    PAYMENT          TRANSID    FEEID     PAYMENT
trans01     exp01    1,000.00         trans03    fee01    3,000.00
trans02     exp02    2,000.00         trans04    fee02    4,000.00
                                      trans05    fee03    5,000.00

它将起作用。

答案 9 :(得分:1)

我是第二个Nic Gibson的方法,这是 永远是我的最爱:

<xsl:variable name='nl'><xsl:text>
</xsl:text></xsl:variable>

但是我一直在使用Ant任务&lt; echoxml&gt;至 创建样式表并针对文件运行它们。该 任务将执行属性值模板,例如$ {DSTAMP}, 但也会重新格式化你的xml,所以在某些 例如,实体参考是可取的。

<xsl:variable name='nl'><xsl:text>&#xa;</xsl:text></xsl:variable>

答案 10 :(得分:1)

我不能只使用<xsl:text>&#xa;</xsl:text>方法,因为如果我使用XSLT格式化XML文件,实体将会消失。所以我不得不使用变量

稍微更圆一些
<xsl:variable name="nl" select="'&#10;'"/>
<xsl:template match="/">
    <xsl:value-of select="$nl" disable-output-escaping="no"/>
    <xsl:apply-templates select="*"/>
</xsl:template>

答案 11 :(得分:0)

<xsl:text xml:space="preserve">
</xsl:text>

答案 12 :(得分:-4)

只需添加此标记:

<br/>

它对我有用;)。