gpt4 book ai didi

java - XSL 转换模板仅返回最后一个属性值

转载 作者:行者123 更新时间:2023-12-02 10:23:53 26 4
gpt4 key购买 nike

堆栈溢出社区您好,新年快乐!这是我第一次使用 XSL 将 xml 转换为另一种 xml 格式。问题是我已经完成了整个工作(或者至少我认为我做到了),但缺点是它不会返回与我预期完全相同的输出。所需的输入和输出如下:输入.xml

    <?xml version="1.0"?>
<TestExecutionSummary>
<ExecutionDate>12-okt-2018 15-43-46</ExecutionDate>
<ExecutedTestCases>3</ExecutedTestCases>
<PassedTestCases>2</PassedTestCases>
<FailedTestCases>1</FailedTestCases>
<TimeTaken>00:03:48</TimeTaken>
<Testcases>
<TestCaseStatus name="TC001" status="PASS"/>
<TestCaseStatus name="TC002" status="PASS"/>
<TestCaseStatus name="TC003" status="FAIL"/>
</Testcases>
</TestExecutionSummary>

输出xml

<?xml version="1.0"?>
<testsuite time="548.000" tests="2" errors="0" skipped="0" failures="1">
<testcase classname="CITS" name="TC001"/>
<testcase classname="CITS" name="TC002"/>
<testcase classname="CITS" name="TC003"/>
<failure type="CITS test failure">unknown failure</failure>
</testsuite>

我的XSL模板如下:

    <?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

<xsl:output encoding="utf-8" method="xml" version="1.0" indent="yes"/>

<xsl:template match="/">
<testsuite>
<xsl:attribute name="time"><xsl:value-of select="TestExecutionSummary/TimeTaken"/></xsl:attribute>
<xsl:attribute name="tests"><xsl:value-of select="TestExecutionSummary/ExecutedTestCases"/></xsl:attribute>
<xsl:attribute name="errors">0</xsl:attribute>
<xsl:attribute name="skipped">0</xsl:attribute>
<xsl:attribute name="failures"><xsl:value-of select="TestExecutionSummary/FailedTestCases"/></xsl:attribute>
<testcase>
<xsl:for-each select="TestExecutionSummary/Testcases/TestCaseStatus[@status]">
<xsl:attribute name="classname">CITS</xsl:attribute>
<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
</xsl:for-each>
</testcase>
<failure><xsl:attribute name="type">CITS test failure</xsl:attribute>"unknown error"</failure>
</testsuite>
</xsl:template>

</xsl:stylesheet>

但我看到的奇怪的事情是,这种转换总是给我返回结果和运行的测试的完整列表。 “xsl:for-each”应该循环遍历 TestCaseStatus 节点并列出我认为的“name”属性。但结果是这样的:

    <testsuite time="00:03:48"
tests="3"
errors="0"
skipped="0"
failures="1">
<testcase classname="CITS" name="TC003"/>
<failure type="CITS test failure">"unknown error"</failure>
</testsuite>
正如你所看到的,我只取回了测试名称 TC003,而不是 TC001 和 TC002,这就是为什么我想知道我在那里做错了什么。我正在尝试同时研究示例 XSL 模板和一些教程,但我没有在任何论坛中遇到用户遇到此问题的任何情况。那么有人可以指出我在那里做错了什么吗?提前致谢!

JFYI,如果需要,我还可以发布我如何使用 XSL 在 groovy 中进行转换,但我认为效果很好,因为我在在线转换网站上尝试了此输入和模板,并且得到了相同的结果。

最佳答案

您需要移动 <testcase> 的创建里面xsl:for-each ,而不是外面。否则您将只创建一个 <testcase>元素,然后尝试向其添加多个属性。 (如果您尝试将属性添加到已具有该属性的元素,则该属性将被替换)。

    <xsl:for-each select="TestExecutionSummary/Testcases/TestCaseStatus[@status]">
<testcase>
<xsl:attribute name="classname">CITS</xsl:attribute>
<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
</testcase>
</xsl:for-each>

或者更好的是,这样做

    <xsl:for-each select="TestExecutionSummary/Testcases/TestCaseStatus[@status]">
<testcase classname="CITS" name="{@name}"/>
</xsl:for-each>

注意 Attribute Value Templates 的使用创建name属性。

关于java - XSL 转换模板仅返回最后一个属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54125295/

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