XSL转换,输出为文本

时间:2012-11-28 08:14:10

标签: xml xslt

Sample XSLT:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="no" omit-xml-declaration="yes" method="text" encoding="utf-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match="main">
<xsl:value-of select="name"/>
SSN: <xsl:value-of select="ssn"/>
<xsl:text>
</xsl:text>
<xsl:value-of select="address1"/>
DOB: <xsl:value-of select="dob"/>
<xsl:text>
</xsl:text>
<xsl:value-of select="address2"/>
GENDER: <xsl:value-of select="gender"/>
EYE COLOR: <xsl:value-of select="eye"/>
HEIGHT: <xsl:value-of select="height"/>
HAIR COLOR: <xsl:value-of select="hair"/>
WEIGHT: <xsl:value-of select="weight"/>
</xsl:template>
</xsl:stylesheet>


Sample XML:

    <main>
<name>CHTP CLS DEBY</name>
<dob>1999-01-08</dob>
<ssn>18454512</ssn>
<address1>115 Z 88TH UL #226-F</address1>
<address2>ARVADA, CO 80004</address2>
<gender>M</gender>
<eye>Blue</eye>
<hair>Brown</hair>
<height>182</height>
<weight>69</weight>
</main>

我想实现这样的目标,

CHTP CLS DEBY                              SSN: *****4512
115 Z 88TH UL #226-F                                 DOB: 1999-01-08
ARVADA, CO 80004                        

Gender:         M
Eye Color:      Blue                                   Height: 182        
Hair Color:     Brown                                  Weight: 69  

使用XSL转换。

1 个答案:

答案 0 :(得分:1)

在XSLT 1.0中没有一般等价的printf("%-30s", something),我使用的通常技巧是创建一个包含长字符串的变量,然后获取适当长度的子字符串。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="no" omit-xml-declaration="yes" method="text" encoding="utf-8"/>
  <xsl:strip-space elements="*"/>

  <xsl:variable name="spaces"
    select="'                                                                   '"/>

  <xsl:template match="main">
    <xsl:call-template name="print-padded">
      <xsl:with-param name="str" select="name" />
      <xsl:with-param name="width" select="43" />
    </xsl:call-template>
    <xsl:text>SSN: </xsl:text>
    <xsl:value-of select="ssn" />
    <xsl:text>&#x0A;</xsl:text>

    <xsl:call-template name="print-padded">
      <xsl:with-param name="str" select="address1" />
      <xsl:with-param name="width" select="53" />
    </xsl:call-template>
    <xsl:text>DOB: </xsl:text>
    <xsl:value-of select="dob" />
    <xsl:text>&#x0A;</xsl:text>

    <!-- and so on for the other elements -->
  </xsl:template>

  <xsl:template name="print-padded">
    <xsl:param name="str" select="''" />
    <xsl:param name="width" select="0" />
    <xsl:value-of select="$str" />
    <xsl:value-of select="substring($spaces, 1, $width - string-length($str))" />
  </xsl:template>
</xsl:stylesheet>

我更喜欢为换行符使用字符引用,因为这对.xsl文件的重新格式化(意外或故意)更为健壮。

编辑:我注意到你也试图混淆SSN,你可以使用相同的技巧

<xsl:variable name="stars" select="'*******************'" />
<xsl:value-of select="substring($stars, 1, string-length(ssn) - 4)" />
<xsl:value-of select="substring(ssn, string-length(ssn) - 4)" />