固定长度输出xml

时间:2015-03-12 14:23:56

标签: xml xslt pentaho

我正在使用XSL Transformation从不同的xml文件生成xml文件。直到现在我已经使用XSL转换成功获得了输出xml文件。但是我希望输出中的每个值都有一个固定的定义长度。这个长度应该如下:

成员:此值的长度应为50个字符。 date:此值的长度应为10个字符。 type:此值的长度应为6个字符。 amount:该值的长度应为10个字符,包括小数点和两位小数。 注释:该值的长度应为50个字符。

我输入的xml文件是:

    <records>
   <record>
    <member>Vikram Singh</member>
    <transaction>
       <date>2015-02-09</date>
       <type>credit</type>
       <amount>300000</amount>
       <remark>successful</remark>
    </transaction>  
    <transaction>
       <date>2015-02-10</date>
       <type>debit</type>
       <amount>30000</amount>
       <remark>successful</remark>
    </transaction>  
    </record>
    <record>
    <member>Sudhanshu Singh</member>
    <transaction>
       <date>2015-01-13</date>
       <type>credit</type>
       <amount>100000</amount>
       <remark>successful</remark>
    </transaction>  
    <transaction>
       <date>2015-02-10</date>
       <type>debit</type>
       <amount>10000</amount>
       <remark>not successful</remark>
    </transaction>  
     </record>     
</records>

我获得的输出是正确的,应该是这样但是长度固定。

  <?xml version="1.0" encoding="UTF-8"?>
<Transactions>
    <Transaction>
        <member>Vikram Singh</member> 
        <date>2015-02-09</date> 
        <type>credit</type> 
        <amount> 300000</amount> 
        <remark>successful</remark> 
    </Transaction>
    <Transaction>
        <member>Vikram Singh</member> 
        <date>2015-02-10</date> 
        <type>debit</type> 
        <amount> 30000</amount> 
        <remark>successful</remark> 
    </Transaction>
    <Transaction>
        <member>Sudhanshu Singh</member> 
        <date>2015-01-13</date> 
        <type>credit</type> 
        <amount> 100000</amount> 
        <remark>successful</remark> 
    </Transaction>
    <Transaction>
        <member>Sudhanshu Singh</member> 
        <date>2015-02-10</date> 
        <type>debit</type> 
        <amount> 10000</amount> 
        <remark>not successful</remark> 
    </Transaction>
</Transactions>

我使用的xsl文件是:

 <xsl:template match = "/">
    <xsl:for-each select="transaction">
        <transaction>
                <member>
                    <xsl:value-of select = "$member"/>
                </member>
                <date>
                    <xsl:value-of select = "date"/>
                </date>
                <type>
                    <xsl:value-of select = "type"/>
                </type>
                <amount>
                    <xsl:value-of select = "amount"/>
                </amount>
                <remark>
                    <xsl:value-of select = "remark"/>
                </remark>
            </transaction>  
        </xsl:for-each>
</xsl:template> 
</xsl:stylesheet>

帮我制作固定长度的输出。

1 个答案:

答案 0 :(得分:2)

  

我正在使用xsl版本:1.0和xsl供应商:libxslt

好,那么你可以使用EXSLT str:align()str:padding函数。这是一个最小化的示例,显示如何将type元素填充为6个字符。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:str="http://exslt.org/strings"
extension-element-prefixes="str">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/records">
    <transactions>
        <xsl:for-each select="record/transaction">
            <transaction>
                <!-- ... -->
                <type>
                    <xsl:value-of select="str:align(type, str:padding(6))"/>
                </type>
                <!-- ... -->
            </transaction>  
        </xsl:for-each>
    </transactions>
</xsl:template> 

</xsl:stylesheet>

编辑:

  

转换正在运行而没有错误,但它没有做到   输出xml中的填充

请运行以下样式表(针对任何有效的XML输入)并报告结果:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:str="http://exslt.org/strings"
extension-element-prefixes="str">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/">
    <results>
        <processsor>
            <xsl:value-of select="system-property('xsl:vendor')"/>
        </processsor>  
        <support>
            <align>
                <xsl:value-of select="function-available('str:align')"/>
            </align>  
            <padding>
                <xsl:value-of select="function-available('str:padding')"/>
            </padding>  
        </support> 
        <spaces>
             <xsl:value-of select="str:padding(10)"/>
        </spaces>  
        <align>
             <xsl:value-of select="str:align('12345', '----------')"/>
        </align>  
        <combined>
            <under>
                 <xsl:value-of select="str:align('12345', str:padding(10))"/>
            </under>  
            <over>
                 <xsl:value-of select="str:align('1234567890123', str:padding(10))"/>
            </over>  
        </combined> 
    </results>
</xsl:template> 

</xsl:stylesheet>