解释xsl:text中的换行符?

13

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

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

样式表本身是一个文本文件,具有“Unix风格”的换行符。我在Windows和类Unix平台上调用此样式表。希望输出符合调用它的平台约定。

当我在Windows上运行此样式表时,输出中除了节点的内容之外,每个地方都有回车/换行对。

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

更多内容:我从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个回答

5
您可以这样定义样式表的参数:
<xsl:param name="br">
    <xsl:text>&#10;</xsl:text>
</xsl:param>

如果您想在Ant脚本中传递适当的换行符,可以使用嵌套的param元素。当然,在此示例中,默认值是Unix风格的换行符。我认为要输出该值,您需要使用:

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

虽然有点啰嗦,但它确实可行。


谢谢您的回答!这是个好主意,但我认为xsl:copy-of不能嵌入在xsl:text的正文中。可以用param定义实体吗?我可以嵌入像<这样的内容,那&myeol;呢?怎么做?理想情况下,我希望无需通过param传递EOL来完成这个操作。 - Greg Mattes
为什么它必须在xsl:text的内部? 不能连续使用几个<xsl:value-of语句吗? - jsight

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>

1

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

<xsl:text>foo&#xD;&#xa;bar&#xD;&#xa;</xsl:text> 来获得您想要的输出。


谢谢您的回答!是的,我觉得我可以这样做,但在类Unix环境中,输出将是错误的!与其一边硬编码,还是另一边硬编码,我希望无论在哪里调用它,它都能“做正确的事情”。也许我应该在问题中澄清这一点。再次感谢。 - Greg Mattes

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>

我再次使用Saxon在Windows 7 x64计算机上运行%ProgramFiles%\SaxonHE\bin\Transform.exe。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接