使用XSLT格式化XML转换的输出以生成Text文件

时间:2014-09-15 04:04:21

标签: java xml xslt

我刚开始使用XSLTXML转换为test文件输出。

这是我的XML输入文件:

<?xml version="1.0" ?>
<transcript>
    <student id="STU12345" name="name 1" status="active">
        <home_address>35 Wall Street, Wonderland, NJ</home_address>
        <interests>
            <interest>interest 1</interest>
            <interest>interest 2</interest>
            <interest>interest 3</interest>
        </interests>
    </student>
    <term>
        <heading name="Winter 1999" />
        <course>
            <course-name>course 1</course-name>
            <grade>A-</grade>
            <credits>4</credits>
        </course>
        <course>
            <course-name>course 2</course-name>
            <grade>B+</grade>
            <credits>3</credits>
        </course>
    </term>
    <summary>summary</summary>
    <comments>
        comments
    </comments>
</transcript>

我要转换此xml的XML文件是:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" indent="no" />

    <xsl:template match="transcript">
        Student Transcript
        <xsl:apply-templates select="student" />

Course Name | Grade | Credits
        <xsl:apply-templates select="term" />
    </xsl:template>

    <xsl:template match="student">
        Name: <xsl:value-of select="@name" />
        ID: <xsl:value-of select="@id" />
    </xsl:template>

    <xsl:template match="term"><xsl:apply-templates /></xsl:template>

    <xsl:template match="course"><xsl:value-of select="course-name"/> |<xsl:value-of select="grade" /> | <xsl:value-of select="credits" />
</xsl:template>

</xsl:stylesheet>

我现在得到的输出是:

        Student Transcript

        Name: name 1
        ID: STU12345

Course Name | Grade | Credits


        course 1 |A- | 4
        course 2 |B+ | 3

但我试图将输出视为:

        Student Transcript

        Name: name 1
        ID: STU12345

Course Name | Grade | Credits
course 1    |A-     | 4
course 2    |B+     | 3

最后我的Java程序帮助我进行转换:

public static void main(String[] args) {
    String xml = "input.xml";
    String xslt = "input.xsl";
    String output = "output.txt";
    try {
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer tr = tf.newTransformer(new StreamSource(xslt));
        tr.transform(new StreamSource(xml), new StreamResult(
                new FileOutputStream(output)));

        System.out.println("Output to " + output);
    } catch (Exception e) {
        System.out.println(e);
        e.printStackTrace();
    }
}

我尝试多次更改我的XSL文件以删除多余的空格并格式化输出但我无法弄清楚需要做什么来获得这样的输出。有人可以帮我这个。

1 个答案:

答案 0 :(得分:1)

如果您使用的是Xalan处理器,则可以利用EXSLT str:align()函数,例如:

XSLT 1.0

<?xml version="1.0" encoding="UTF-8"?>
<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="text" encoding="UTF-8"/>

<xsl:template match="/transcript">
    <!-- STUDENT -->
    <xsl:text>        Student Transcript&#10;        Name: </xsl:text>
    <xsl:value-of select="student/@name" />
    <xsl:text>&#10;        ID: </xsl:text>
    <xsl:value-of select="student/@id" />
    <!-- COURSES -->
    <xsl:text>&#10;&#10;Course Name | Grade | Credits&#10;</xsl:text>
    <xsl:for-each select="term/course">
        <xsl:value-of select="str:align(course-name, '            | ', 'left')" />
        <xsl:value-of select="str:align(grade, '      | ', 'left')" />
        <xsl:value-of select="credits" />
        <xsl:if test="position()!=last()">
            <xsl:text>&#10;</xsl:text>
        </xsl:if>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

应用于您的示例输入,将返回:

        Student Transcript
        Name: name 1
        ID: STU12345

Course Name | Grade | Credits
course 1    | A-    | 4
course 2    | B+    | 3

请参阅此处的工作示例:http://xsltransform.net/bdxtpM

注意:您需要一个非错误版本的Xalan才能正常工作。否则你将不得不编写一个递归命名模板来进行填充,或者使用substring()函数来&#34; cut&#34;一串空格中的匹配片段。