代码之家  ›  专栏  ›  技术社区  ›  Andez

在XSL中包含空白的XSL输出方法文本

  •  3
  • Andez  · 技术社区  · 14 年前

    我正在创建一些XSL来将XML转换为文本(最终将是CSV)。我正在使用VS2008。当我使用编辑器创建XSL时,转换后的输出将根据我的XSL缩进。但是,如果我编辑XSL并删除它正确输出的格式化空白,那么这样做是一个噩梦。

    是否有一些XSL预处理程序命令或标记可以防止这种情况发生?我想忽略XSL中的任何空白,只使用 <!CDATA[]]> <xsl:text> .

    我的XSL如下-这将缩进输出

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
    >
      <xsl:output method="text" indent="no"/>
      <!-- @* is all class attributes -->
      <xsl:template match="/">
        <xsl:text>CSV Output</xsl:text>
        <!-- Start of output -->
        <xsl:for-each select="//rows/row">
          <![CDATA[row id=]]><xsl:value-of select="(@id)"/>
        </xsl:for-each>
        <!-- OK, that is the end of the file -->
        <![CDATA[<EOF>]]>
      </xsl:template>
    </xsl:stylesheet>
    

    其输出如下:

    CSV Output
          row id=0
          row id=1
        <EOF>
    

    但是,以下输出正确:

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
    >
      <xsl:output method="text" indent="no"/>
      <!-- @* is all class attributes -->
      <xsl:template match="/">
        <xsl:text>CSV Output</xsl:text>
        <!-- Start of output -->
        <xsl:for-each select="//rows/row">
    <![CDATA[row id=]]><xsl:value-of select="(@id)"/>
    </xsl:for-each>
    <!-- OK, that is the end of the file -->
    <![CDATA[<EOF>]]>
      </xsl:template>
    </xsl:stylesheet>
    

    输出正确如下:

    CSV Output
    row id=0
    row id=1
    <EOF>
    

    我还想控制新行的位置。在我的XSL中,我不会让它包含一个。

    请帮助!!

    谢谢,

    安德仕

    2 回复  |  直到 12 年前
        1
  •  6
  •   PointedEars    12 年前

    XSLT处理器仅在XSLT元素之间剥离模板中的空白文本节点。

    所以,在

    <xsl:for-each select="//rows/row"> 
      <![CDATA[row id=]]><xsl:value-of select="(@id)"/> 
    </xsl:for-each>
    

    这个 xsl:for-each 元素有两个空白文本子节点:一个在后面 xsl:value-of ,它被剥离;另一个位于CDATA节之前,它没有被剥离。

    底线:使用 xsl:text 元素。

    <xsl:for-each select="//rows/row"> 
      <xsl:text><![CDATA[row id=]]></xsl:text>
      <xsl:value-of select="@id"/> 
    </xsl:for-each>
    
        2
  •  5
  •   Oded    14 年前

    你可以使用 xsl:strip 元素来声明哪些元素不应该有空格(或使用 * 对于所有元素):

    <xsl:strip-space elements="*"/>
    

    柜台部分是 xsl:preserve ,它允许您声明哪些元素应该保留空白。您可以同时使用:

    <xsl:strip-space elements="*"/>
    <xsl:preserve-space elements="td span"/>
    <!-- strip spaces from all elements apart from td and span elements -->