【问题标题】:Interpreting newlines with xsl:text?用 xsl:text 解释换行符?
【发布时间】:2008-10-08 22:04:36
【问题描述】:

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

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

样式表本身是一个带有“unix 风格”换行符的文本文件。我在 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>

【问题讨论】:

    标签: xml xslt ant xslt-1.0 whitespace


    【解决方案1】:

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

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

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

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

    它很冗长,但它有效。

    【讨论】:

    • 感谢您的回答!这是个好主意,但我不认为 xsl:copy-of 可以嵌入到 xsl:text 的正文中。可以用参数定义实体吗?我可以嵌入像
    • 为什么它必须在 xsl:text 中?为什么不连续几条
    【解决方案2】:

    如果你是从 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>
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 感谢您的回答!是的,我认为我可以这样做,但是在类 unix 的环境中输出将是错误的!我不想以一种或另一种方式对其进行硬编码,而是希望它“做正确的事情”,而不管它在哪里被调用。也许我应该在问题中澄清这一点。再次感谢。
      【解决方案4】:

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

      <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 机器上。

      【讨论】:

        猜你喜欢
        • 2015-08-28
        • 1970-01-01
        • 2012-03-05
        • 1970-01-01
        • 2014-07-18
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        相关资源
        最近更新 更多