13

我有一个 XSL 样式表,其xsl:text节点中的内容如下:

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

样式表本身是一个带有“unix 风格”换行符的文本文件。我在 Windows 和类 unix 平台上调用这个样式表。如果输出符合调用它的平台的约定,那就太好了。

当我在 Windows 上运行这个样式表时,除了xsl:text节点的内容之外,输出都有回车/换行对。

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

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

<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

4 回答 4

5

您可以像这样为样式表定义一个参数:

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

并通过在 Ant 脚本中使用嵌套的 param 元素传入适当的行尾字符。当然,此示例中的默认值是 Unix 风格的换行符。我认为要输出值,您必须使用:

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

它很冗长,但它有效。

于 2008-10-09T15:12:08.467 回答
4

如果您从 Ant 调用转换,那么您可以使用条件任务测试操作系统并测试操作系统系列

  <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>
于 2008-10-10T15:50:26.787 回答
1

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

<xsl:text>foo&#xD;&#xa;bar&#xD;&#xa;</xsl:text>得到你正在寻找的输出。

于 2008-10-08T22:49:27.280 回答
0

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

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

同样,我在 Windows 7 x64 机器上使用 Saxon %ProgramFiles%\SaxonHE\bin\Transform.exe。

于 2011-04-28T21:02:45.073 回答