2016-12-03 111 views
0

我是XSLT 2.0的新手,我必须将XML转换为文本文件(CSV),但我希望输出为行属性顺序(请参阅下面的内容XML,样式表和输出)。正如你所看到的,line =“9”的输出应该是第二行。问题是如何更改样式表以实现正确的输出?将XML转换为文本(csv文件)按属性排序

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <MP>   
     <CSVIMP line="10" content="xyz"/> 
     <CSVIMP line="11" content="123"/> 
     <CSVIMP line="8" content="123"/> 
    </MP> 
    <MP> 
     <CSVIMP line="9" content="abc"/> 
     <CSVIMP line="12" content="456"/> 
    </MP> 
</root> 

我的样式表:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="text" encoding="UTF-8" /> 

    <xsl:variable name="delimiter" select="','"/> 

    <xsl:template match="MP"> 
     <xsl:for-each select="CSVIMP"> 
      <xsl:sort select="./@line" data-type="number"></xsl:sort> 
      <xsl:value-of select="./@line"/> 
      <xsl:value-of select="$delimiter"/> 
      <xsl:value-of select="./@content"/> 
      <xsl:text>&#10;</xsl:text> 
     </xsl:for-each> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="text()"></xsl:template> 
</xsl:transform> 

变换的输出(撒克逊9.5 HE):

8,123 
10,xyz 
11,123 
9,abc 
12,456 

回答

1

难正是你想要的说没有看到预期的输出。既然你说“行的输出=” 9" 应该是2号线,我想你想这样做(且仅此):

<xsl:template match="/root"> 
    <xsl:for-each select="MP/CSVIMP"> 
     <xsl:sort select="./@line" data-type="number"></xsl:sort> 
     <xsl:value-of select="./@line"/> 
     <xsl:value-of select="$delimiter"/> 
     <xsl:value-of select="./@content"/> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 

而且由于你使用XSLT 2.0,你很可能*缩短了整个事情:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text" encoding="UTF-8" /> 

<xsl:template match="/root"> 
    <xsl:for-each select="MP/CSVIMP"> 
     <xsl:sort select="./@line" data-type="number"/> 
     <xsl:value-of select="@line, @content" separator=","/> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

(*)假设所有CSVIMP元素具有两个属性。