保留空间XslCompiledTransform

时间:2014-02-04 10:21:39

标签: c# xml xslt xslcompiledtransform

我试图保留我的xslt文档中的空格,我的代码是

var xslCompiledTransform = new XslCompiledTransform();
xslCompiledTransform.Load( @"SimpleSpacing.xslt" );
string result;
using ( XmlReader reader = XmlReader.Create( @"SimpleSpacing.xml" ) )
            {
                using ( var stringWriter = new StringWriter() )
                {
                    using ( var htmlTextWriter = new SpawtzHtmlTextWriter( stringWriter ) )
                    {
                        xslCompiledTransform.Transform( reader, args, htmlTextWriter );
                        htmlTextWriter.Flush();
                    }
                    result =  stringWriter.ToString();
                }
            }

Xslt文件

<?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="html"/>
        <xsl:preserve-space elements="*"/>

    <xsl:template match="/">
      <xsl:apply-templates select="*"/>
    </xsl:template>

  <xsl:template match="root">
    <xsl:value-of select="FirstWord"/>&#032;<xsl:value-of select="SecondWord"/>
  </xsl:template>
</xsl:stylesheet>

Xml文档

<root>
  <FirstWord>Hello</FirstWord>
  <SecondWord>World</SecondWord>
</root>

我的预期输出是“Hello World”,但我目前正在收到“HelloWorld”,非常感谢帮助。

2 个答案:

答案 0 :(得分:1)

或者,您可以使用

<xsl:value-of select="concat(FirstWord, ' ', SecondWord)"/>

答案 1 :(得分:0)

一般的空白保存不是错误的。只是首先在输入XML中没有空白字符 - 而且在XSLT过程中你从未引入过任何空白字符。

空CDATA部分(<![CDATA[]]>)不会在输出XML中产生空格。

将您的root模板定义更改为:

<xsl:template match="root">
    <xsl:value-of select="FirstWord"/>
    <xsl:text> </xsl:text>
    <xsl:value-of select="SecondWord"/>
</xsl:template>

修改

<?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="html"/>
 <xsl:preserve-space elements="*"/>

 <xsl:template match="/">
   <xsl:apply-templates/>
 </xsl:template>

 <xsl:template match="root">
   <xsl:value-of select="FirstWord"/>
   <xsl:text>&#032;</xsl:text>
   <xsl:value-of select="SecondWord"/>
 </xsl:template>

</xsl:stylesheet>

顺便说一下,保留空间是XSLT处理器采取的默认操作。所以,实际上你不必指定它。