gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:32:23 24 4
gpt4 key购买 nike

我刚刚开始使用 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 文件以删除多余的空格并格式化输出,但我无法确切地弄清楚需要做什么才能获得这样的输出。有人可以帮我解决这个问题吗?

最佳答案

如果您使用的是 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() 函数从空格字符串中“剪切”出匹配的片段。

关于java - 使用 XSLT 格式化 XML 转换的输出以生成文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25840661/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com