用xsl:text解释换行符?

时间:2008-10-08 22:04:36

标签: xml xslt ant xslt-1.0 whitespace

我有一个XSL样式表,内容在xsl:text节点中,如下所示:

<xsl:text>
foo
bar
baz
</xsl:text>

样式表本身是一个带有“unix-style”换行符终结符的文本文件。我在Windows上调用此样式表以及类似unix的平台。将输出符合调用它的平台的约定会很好。

当我在Windows上运行此样式表时,输出具有所有内容的回车/换行符对,除了 xsl:text节点的内容。

我可以指示XSLT处理器将xsl:text节点内容中的换行符转换为特定于平台的行尾吗?

更多上下文:我正在调用Apache Ant 1.7.1 XSLT task中的样式表,如下所示:

<xslt in="in.xml" out="out.xml" style="stylesheet.xsl"/>

样式表标题目前如下所示:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xalan="http://xml.apache.org/xslt"
    exclude-result-prefixes="xalan">
    <!-- contents elided -->
</xsl:stylesheet>

4 个答案:

答案 0 :(得分:5)

您可以为样式表定义参数,如下所示:

<xsl:param name="br">
    <xsl:text>&#10;</xsl:text>
</xsl:param>

并使用Ant脚本中的嵌套param元素传入适当的行尾字符。当然,这个例子中的默认值是Unix风格的换行符。我想输出值,你必须使用:

<xsl:copy-of select="$br"/>

这很冗长,但确实有效。

答案 1 :(得分:4)

如果您从Ant调用转换,则you can test for the OS using a conditional task with a test for the OS family

  <condition property="linebreak" value="&#xD;&#xa;">
      <os family="windows"/>
  </condition>
  <condition property="linebreak" value="&#xa;">
      <os family="unix"/>
  </condition>

然后将该参数传递给XSLT,以指示您要使用哪个换行符。

 <xslt in="data.xml" out="${out.dir}/out.xml">
   <param name="linebreak" expression="${linebreak}" />
 </xslt>

答案 2 :(得分:1)

我不确定如何自动执行正确的换行符(可能取决于您使用的xslt处理器),但您可以强制在文本节点的内容中添加换行符。 \ r \ n是&#xD; &#xA;,\ n是&#xA;,例如你会用:

<xsl:text>foo&#xD;&#xa;bar&#xD;&#xa;</xsl:text>获取您正在寻找的输出。

答案 3 :(得分:0)

好吧,我让我的工作(使用Saxon)结合了上述两个想法:

<xsl:param name="br">
        <xsl:text>&#xD;&#xa;</xsl:text>
</xsl:param>

然后在需要时使用这些行。

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

这是我的完整(但细长)xsl

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!--<xsl:strip-space elements="*" />-->
  <xsl:output method="text" />
  <!-- <xsl:preserve-space elements="*"/>-->
<xsl:param name="br">
        <xsl:text>&#xD;&#xa;</xsl:text>
</xsl:param>


  <!--  -->
  <xsl:template match="/">


    <xsl:for-each select="//root/Item">

        <xsl:value-of select="@Name" /> <!-- Your xpath will vary of course! -->
        <xsl:value-of select="$br" />

    </xsl:for-each>

</xsl:template>

同样,我正在使用撒克逊人 的%ProgramFiles%\ SaxonHE \ BIN \ Transform.exe 在Windows 7 x64机器上。