2016-08-23 100 views
0

我在使用XSLT格式化XML时遇到问题。目前,我的代码写的:使用XSLT XML格式化问题

  <FileData> 
       <File 
       FileNumber="{$ISCI}" 
       title="Test Ad" 
       advertiser="{$Advertiser}" 
       /> 
      </FileData> 

这回给我格式化为这样的输出:

<?xml version="1.0" encoding="utf-8"?> 
    <FileData> 
     <File FileNumber="CBIPI3316B6" advertiser="SOKOLOVE LAW" title="Test Ad"/> 
    </FileData> 

我,而不是需要的格式:

<?xml version="1.0" encoding="utf-8"?> 
    <FileData> 
     <File 
     FileNumber= "CBIPI3316B6" 
     advertiser= "SOKOLOVE LAW" 
     title=   "Test Ad" 
     /> 

是否有简单的方法来转换呢?我尝试过使用& #xa,但是我无法成功更改输出。

回答

0

您不是在XSLT代码中编写词法结果,而是编写指令来创建可以序列化的结果树。因此,无论你有一个文字结果元素写成

<foo att1="value1" att2="value2"/> 

<foo att1="value1" 
    att2="value2"/> 

并不决定你的XSLT代码序列化的结果看起来如何尽可能的属性有关。就我所知,XSLT规范没有对属性格式和缩进做任何规定。然而用于指定串行线路长度,如果设置的是非常低的,然后每个属性上属于自己的行结束撒克逊9支持串行扩展属性saxon:line-length的商业版本,所以

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

    <xsl:param name="ISCI" select="'foo'"/> 
    <xsl:param name="Advertiser" select="'bar'"/> 

    <xsl:output method="xml" indent="yes" xmlns:saxon="http://saxon.sf.net/" saxon:line-length="5"/> 

    <xsl:template match="/"> 
     <FileData> 
      <File FileNumber="{$ISCI}" title="Test Ad" advertiser="{$Advertiser}"/> 
     </FileData> 
    </xsl:template> 


</xsl:transform> 

例如输出

<FileData> 
    <File FileNumber="foo" 
     title="Test Ad" 
     advertiser="bar"/> 
</FileData> 

你必须检查你的XSLT处理器是否提供类似的东西,但总的来说,如果你真的想要一个特定的序列那么我认为你需要编写自己的串行采取XSLT转换的树结果和将其序列化或插入XSLT处理工具链。

+0

谢谢你的回答,但我不能使用撒克逊作为我的XSLT – user6391187

+0

@ user6391187的一部分,我不知道任何其他XSLT处理器提供了一些扩展属性来更改格式。无论如何,答案都包含一些提示,如编写自己的序列化程序,以指示需要执行的操作。如何完成取决于所使用的XSLT处理器及其API和使用的平台。因此,如果你想获得具体的帮助,那么你需要指出你使用了哪个XSLT处理器,以及如何使用它,因为显然编写和插入定制串行器取决于在XSLT之外完成的一些编程。 –