2016-12-03 62 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元素具有兩個屬性。