XSLT转换后换行符不见了

时间:2013-12-08 13:08:36

标签: xml xslt

我的XML:

<root>
  <summary>
     <article_1>some data&#xA;</article_1>
  </summary>
  <summary>
     <article_1>some data&#xA;</article_1>
  </summary>
  .
  .
  .
</root>

我正在尝试将所有摘要标记复制到单独的文件中,但是当XSLT转换完成后,我在新创建的文件中丢失了换行符。

我的XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="no" version="1.0" encoding="UTF-8" standalone="yes"/>
<xsl:template match="summary">
  <xsl:result-document href="{@summary}.xml">
    <xsl:copy-of select="." />
  </xsl:result-document>
</xsl:template>
</xsl:stylesheet>

我做错了什么,为什么我新创建的XML中没有换行符?

4 个答案:

答案 0 :(得分:1)

无论您是否编码,换行符都被视为空格。您可以添加指令:

<xsl:preserve-space elements="article_1"/>

确保保留空白区域。

答案 1 :(得分:0)

即使它们看起来已经消失,你也不会丢失任何换行符(新行)。

假设一个明智的输入XML

<?xml version="1.0" encoding="utf-8"?>
<root>
  <summary number="1">
   <article_1>text1&#xA;</article_1>
  </summary>
  <summary number="2">
   <article_1>text2&#xA;</article_1>
  </summary>
  <!--...-->
</root>

这个样式表(这是在XSLT 2.0中,当您使用result-document()时):

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

     <xsl:output method="xml" indent="no" version="1.0" encoding="UTF-8" standalone="yes"/>

     <xsl:template match="summary">
       <xsl:result-document href="{@number}.xml">
         <xsl:copy-of select="." />
       </xsl:result-document>
     </xsl:template>

</xsl:stylesheet>

这会产生几个输出文档,就像这里显示的1.xml一样:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><summary number="1">
  <article_1>text1
  </article_1>
</summary>

正如您所看到的,还有一条新线。它不再被编码为实体引用(&#xA;),而是转换为实际的中断。如果您使用像Firefox这样的浏览器查看结果文件,可能会让您误以为新行不再存在,但这只是由浏览器解析器自动应用的格式。


请注意,除了换行问题,您的帖子还有严重问题。

  • 作为输出XML文件的名称,您选择@summary,但在输入XML中没有这样的属性。在我已经显示的输入中,有一个number属性被翻译成文件名。
  • 您正在使用仅在XSLT 2.0中可用的result-document()函数(即使用XSLT 2.0处理器)。那么为什么你的样式表在version="1.0"

答案 2 :(得分:0)

如果您的XML输入使用CDATA,则可以在XSL中进行 linefeed-treatment =“ preserve”

示例: XML输入

<data>
  <Alert>
        <![CDATA[PredniOD
         Ca32mg Mane
         Cholenthly]]>
   </Alert>
</data>

XSL 1.0

<fo:block linefeed-treatment="preserve">
     <xsl:value-of select="data/Alert" />
 </fo:block>

输出

 PredniOD
 Ca32mg Mane
 Cholenthly

其他有用的

white-space-collapse =“ false” white-space-treatment =“ preserve”

答案 3 :(得分:0)

我在XSLT中得到了保留了换行符的变量。但是,当使用XSL转换为HTML时,不会保留换行符。然后了解使用

{
"error": {
"message": "(#33) This object does not exist or does not support this action",
"type": "OAuthException",
"code": 33,
"fbtrace_id": "A7EHydY_B4x......."
}
}

现在能够保留来自源的换行符