2016-12-03 13 views
0

XSLT 2.0が新しく、XMLをテキストファイル(CSV)に変換する必要がありますが、出力を行属性順にしたいXML、スタイルシート、および出力)。ご覧のように、line = "9"の出力は2行目になります。質問は正しい出力を得るためにスタイルシートをどのように変更できますか?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> 

(*):あなたはおそらく*に全体を短縮することができ要素には両方の属性があります。

関連する問題