使用“一个空格字符”转换XSLT文本元素会产生空内容

时间:2010-10-08 14:16:51

标签: xml xslt msxml6

我有这个传入的XML我正在转换(使用msxsm6在ASP中使用XSLT):

<Cell>  
  <Data xmlns="http://www.w3.org/TR/REC-html40">  
    <Font>Text1</Font>  
    <Font> </Font>  
    <Font>Text2</Font>  
  <Data>  
</Cell>

如果&lt; Font&gt;的模板是:

<xsl:template match="Font">
  <xsl:copy/>
</xsl:template>

转换似乎消除了源中第二个元素中的空格字符,发出的输出XML在下面,第二个元素变为空的,没有内容:

    <Font>Text1</Font>  
    <Font/>  
    <Font>Text2</Font>  

我对&lt; xsl:preserve-space elements =“Font”/&gt;'进行了试验和纠错但这似乎没有帮助。想法?谢谢Stackoverflow!

2 个答案:

答案 0 :(得分:1)

首先,样式表片段样本是错误的。您需要这样的规则:

<xsl:template match="html:data//node()|html:data//*/@*"
              xmlns:html="http://www.w3.org/TR/REC-html40"> 
  <xsl:copy>
     <xsl:apply-templates select="node()|@*"> 
  </xsl:copy> 
</xsl:template>

其次,关于输入空白区域只有文本节点。这些将保留,具体取决于XML树提供程序。 MSXSL默认不保留它。唯一的解决方案是在输入源中添加xml:space="preserve"属性。

答案 1 :(得分:1)

  

如果模板为:

<xsl:template match="Font"> 
  <xsl:copy/> 
</xsl:template>
     

这种转变似乎扼杀了   第二个元素中的空格字符   来源

您误认为 <xsl:copy> <xsl:copy-of>

前者仅复制当前元素及其命名空间节点(不复制属性或后代节点),而后者复制以当前节点为根的完整子树。

此外,正如@Alejandro所述,您遇到名称空间问题,并且提供的XSLT代码在应用于提供的XML文档时不可能产生提供的“结果”。