将XML转换为文本文件

huangapple go评论58阅读模式
英文:

Transform XML to Text file

问题

我想将以下的XML转换成文本文件,使得汽车的类型和日期只在标题中出现一次,而时间则在下面列出。并且标题是按日划分的。我尝试过分组和不分组,但目前还没有找到解决方案。请建议我如何做。谢谢。

输入XML:

<?xml version="1.0" encoding="UTF-8"?>
<data>
    <item>
        <Date>2023-02-19</Date>
        <Cars>Ford</Cars>
        <SellTarget>A4+</SellTarget>
        <Time>10:40:09</Time>
        <avg>19.3464027998</avg>
    </item>
    <!-- 其他item节点 -->
</data>

XSLT:

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

    <!-- XSLT 模板部分 -->

</xsl:stylesheet>

输出文本文件(当前状态):

Ford / 2023-02-19 [ 50 Entrants ]    1    10:40:09    19.3464027998
Opel / 2023-02-19 [ 50 Entrants ]    2    14:05:51    41.7428144493

我想要的输出:

Ford / 2023-02-19 [ 50 Entrants ]
1    10:40:09    19.3464027998
2    11:21:56    32.7150023474
3    19:01:27    554.0289810087
4    23:15:26    46.1398232343
Opel / 2023-02-19 [ 50 Entrants ]
1    02:00:00    1.2954721559
2    14:05:51    41.7428144493
3    15:01:02    65.6303001034
英文:

I would like to convert the following XML to a text file, so that the type and date of the cars appear only once in the header, but the times are listed below. And the header is created with a daily breakdown. I tried grouping first and without grouping, but so far I can't find the solution. Please advise how I can do this. Thanks.

input XML:

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;data&gt;
    &lt;item&gt;
        &lt;Date&gt;2023-02-19&lt;/Date&gt;
        &lt;Cars&gt;Ford&lt;/Cars&gt;
        &lt;SellTarget&gt;A4+&lt;/SellTarget&gt;
        &lt;Time&gt;10:40:09&lt;/Time&gt;
        &lt;avg&gt;19.3464027998&lt;/avg&gt;
    &lt;/item&gt;
    &lt;item&gt;
        &lt;Date&gt;2023-02-19&lt;/Date&gt;
        &lt;Cars&gt;Ford&lt;/Cars&gt;
        &lt;SellTarget&gt;A4+&lt;/SellTarget&gt;
        &lt;Time&gt;11:21:56&lt;/Time&gt;
        &lt;avg&gt;32.7150023474&lt;/avg&gt;
    &lt;/item&gt;
    &lt;item&gt;
        &lt;Date&gt;2023-02-19&lt;/Date&gt;
        &lt;Cars&gt;Ford&lt;/Cars&gt;
        &lt;SellTarget&gt;A4+&lt;/SellTarget&gt;
        &lt;Time&gt;19:01:27&lt;/Time&gt;
        &lt;avg&gt;554.0289810087&lt;/avg&gt;
    &lt;/item&gt;
    &lt;item&gt;
        &lt;Date&gt;2023-02-19&lt;/Date&gt;
        &lt;Cars&gt;Ford&lt;/Cars&gt;
        &lt;SellTarget&gt;A4+&lt;/SellTarget&gt;
        &lt;Time&gt;23:15:26&lt;/Time&gt;
        &lt;avg&gt;46.1398232343&lt;/avg&gt;
    &lt;/item&gt;
    &lt;item&gt;
        &lt;Date&gt;2023-02-19&lt;/Date&gt;
        &lt;Cars&gt;Opel&lt;/Cars&gt;
        &lt;SellTarget&gt;A4+&lt;/SellTarget&gt;
        &lt;Time&gt;14:05:51&lt;/Time&gt;
        &lt;avg&gt;41.7428144493&lt;/avg&gt;
    &lt;/item&gt;
    &lt;item&gt;
        &lt;Date&gt;2023-02-19&lt;/Date&gt;
        &lt;Cars&gt;Opel&lt;/Cars&gt;
        &lt;SellTarget&gt;A4+&lt;/SellTarget&gt;
        &lt;Time&gt;15:01:02&lt;/Time&gt;
        &lt;avg&gt;65.6303001034&lt;/avg&gt;
    &lt;/item&gt;
    &lt;item&gt;
        &lt;Date&gt;2023-02-19&lt;/Date&gt;
        &lt;Cars&gt;Opel&lt;/Cars&gt;
        &lt;SellTarget&gt;A4+&lt;/SellTarget&gt;
        &lt;Time&gt;02:00:00&lt;/Time&gt;
        &lt;avg&gt;1.2954721559&lt;/avg&gt;
    &lt;/item&gt;
&lt;/data&gt;

XSLT:

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;xsl:stylesheet xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot; version=&quot;1.0&quot;&gt;
	&lt;xsl:output method=&quot;text&quot; encoding=&quot;UTF-8&quot;/&gt;

	&lt;xsl:key name=&quot;carsgroup&quot; match=&quot;/data/item&quot; use=&quot;concat(Cars, &#39;|&#39;, Date)&quot; /&gt;

	&lt;xsl:variable name=&quot;tab&quot; select=&quot;&#39;&amp;#09;&#39;&quot;/&gt;
	&lt;xsl:variable name=&quot;newLine&quot; select=&quot;&#39;&amp;#10;&#39;&quot;/&gt;
	&lt;xsl:variable name=&quot;csvSeparator&quot; select=&quot;$tab&quot;/&gt;
	
	&lt;xsl:template match=&quot;/&quot;&gt;
		&lt;xsl:call-template name=&quot;headerlines&quot;/&gt;
		&lt;xsl:apply-templates select=&quot;data/item[generate-id() = generate-id(key(&#39;carsgroup&#39;, 
			concat(Cars, &#39;|&#39;, Date)))]&quot; mode=&quot;dataRows&quot;&gt;
		&lt;/xsl:apply-templates&gt;
	&lt;/xsl:template&gt;
	
	&lt;xsl:template name=&quot;headerlines&quot;&gt;
		&lt;!-- 1. line is Skipped --&gt;
		&lt;xsl:call-template name=&quot;csv&quot;&gt;
			&lt;xsl:with-param name=&quot;val&quot; select=&quot;&#39;&#39;&quot;/&gt;
		&lt;/xsl:call-template&gt;
		&lt;!-- 2. line is Skipped--&gt;
		&lt;xsl:call-template name=&quot;csv&quot;&gt;
			&lt;xsl:with-param name=&quot;val&quot; select=&quot;&#39;&#39;&quot;/&gt;
		&lt;/xsl:call-template&gt;
		&lt;!-- 3. line is Skipped --&gt;
		&lt;xsl:call-template name=&quot;csv&quot;&gt;
			&lt;xsl:with-param name=&quot;val&quot; select=&quot;&#39;&#39;&quot;/&gt;
		&lt;/xsl:call-template&gt;
		&lt;!-- 4. line is Skipped --&gt;
		&lt;xsl:call-template name=&quot;csv&quot;&gt;
			&lt;xsl:with-param name=&quot;val&quot; select=&quot;&#39;&#39;&quot;/&gt;
			&lt;xsl:with-param name=&quot;isLastCol&quot; select=&quot;true()&quot;/&gt;
		&lt;/xsl:call-template&gt;
	&lt;/xsl:template&gt;

	&lt;xsl:template match=&quot;item&quot; mode=&quot;dataRows&quot;&gt;
		&lt;!-- at 5. line the first 5 char is skipped --&gt;
		&lt;xsl:call-template name=&quot;csv&quot;&gt;
			&lt;xsl:with-param name=&quot;val&quot; select=&quot;concat(&#39;    &#39;, Cars, &#39; / &#39;, Date, &#39; [ 50 Entrants ]&#39;)&quot;/&gt;
		&lt;/xsl:call-template&gt;
		&lt;!-- sequence number --&gt;
		&lt;xsl:call-template name=&quot;csv&quot;&gt;
			&lt;xsl:with-param name=&quot;val&quot; select=&quot;position()&quot;/&gt;
		&lt;/xsl:call-template&gt;
		&lt;!-- Time HH:MM:SS --&gt;
		&lt;xsl:call-template name=&quot;csv&quot;&gt;
			&lt;xsl:with-param name=&quot;val&quot; select=&quot;Time&quot;/&gt;
		&lt;/xsl:call-template&gt;
		&lt;!-- avg --&gt;
		&lt;xsl:call-template name=&quot;csv&quot;&gt;
			&lt;xsl:with-param name=&quot;val&quot; select=&quot;avg&quot;/&gt;
			&lt;xsl:with-param name=&quot;isLastCol&quot; select=&quot;true()&quot;/&gt;
			&lt;xsl:with-param name=&quot;isEOF&quot; select=&quot;position()=last()&quot;/&gt;
		&lt;/xsl:call-template&gt;
	&lt;/xsl:template&gt;

	&lt;xsl:template name=&quot;csv&quot;&gt;
		&lt;xsl:param name=&quot;val&quot;/&gt;
		&lt;xsl:param name=&quot;isLastCol&quot; select=&quot;false()&quot;/&gt;
		&lt;xsl:param name=&quot;isEOF&quot; select=&quot;false()&quot;/&gt;
		&lt;xsl:value-of select=&quot;$val&quot;/&gt;
		&lt;xsl:choose&gt;
			&lt;xsl:when test=&quot;$isLastCol and not($isEOF)&quot;&gt;
				&lt;xsl:value-of select=&quot;$newLine&quot;/&gt;
			&lt;/xsl:when&gt;
			&lt;xsl:when test=&quot;not($isEOF)&quot;&gt;
				&lt;xsl:value-of select=&quot;$csvSeparator&quot;/&gt;
			&lt;/xsl:when&gt;
		&lt;/xsl:choose&gt;
	&lt;/xsl:template&gt;

&lt;/xsl:stylesheet&gt;

output text file atm:

 Ford / 2023-02-19 [ 50 Entrants ]	1	10:40:09	19.3464027998
 Opel / 2023-02-19 [ 50 Entrants ]	2	14:05:51	41.7428144493

What i want:

     Ford / 2023-02-19 [ 50 Entrants ]
1	10:40:09	19.3464027998
2	11:21:56	32.7150023474
3	19:01:27	554.0289810087
4	23:15:26	46.1398232343
     Opel / 2023-02-19 [ 50 Entrants ]
1	02:00:00	1.2954721559
2	14:05:51	41.7428144493
3	15:01:02	65.6303001034

答案1

得分: 1

以下是您要的翻译内容:

Muenchian分组通常分为两个阶段:首先,您识别每个组中的第一个项目并创建一个组;然后,您处理此组中的项目。您尝试的问题在于它缺少第二部分。

尝试调整这个**简化的**样式表:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:key name="carsgroup" match="item" use="concat(Cars, '|', Date)" />

<xsl:template match="/data">
    <xsl:for-each select="item[generate-id() = generate-id(key('carsgroup', concat(Cars, '|', Date))[1])]">
        <!-- group header -->
        <xsl:value-of select="Cars"/>
        <xsl:text>/</xsl:text>
        <xsl:value-of select="Date"/>
        <xsl:text>&#10;</xsl:text>
        <!-- group items -->
        <xsl:for-each select="key('carsgroup', concat(Cars, '|', Date))">
            <xsl:value-of select="position()"/>
            <xsl:text>&#9;</xsl:text>
            <xsl:value-of select="Time"/>
            <xsl:text>&#9;</xsl:text>
            <xsl:value-of select="avg"/>
            <xsl:text>&#10;</xsl:text>
        </xsl:for-each>  
    </xsl:for-each>            
</xsl:template>

</xsl:stylesheet>

请注意,我已经保留了代码部分,并只翻译了注释和文本内容。

英文:

Muenchian grouping usually works in two stages: first you identify the first item in each group and create a group; then you process the items in this group. The problem with your attempt is that it lacks the second part.

Try adapting this simplified stylesheet:

&lt;xsl:stylesheet version=&quot;1.0&quot; 
xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;&gt;
&lt;xsl:output method=&quot;text&quot; encoding=&quot;UTF-8&quot;/&gt;

&lt;xsl:key name=&quot;carsgroup&quot; match=&quot;item&quot; use=&quot;concat(Cars, &#39;|&#39;, Date)&quot; /&gt;

&lt;xsl:template match=&quot;/data&quot;&gt;
	&lt;xsl:for-each select=&quot;item[generate-id() = generate-id(key(&#39;carsgroup&#39;, concat(Cars, &#39;|&#39;, Date))[1])]&quot;&gt;
		&lt;!-- group header --&gt;
		&lt;xsl:value-of select=&quot;Cars&quot;/&gt;
		&lt;xsl:text&gt;/&lt;/xsl:text&gt;
		&lt;xsl:value-of select=&quot;Date&quot;/&gt;
		&lt;xsl:text&gt;&amp;#10;&lt;/xsl:text&gt;
		&lt;!-- group items --&gt;
		&lt;xsl:for-each select=&quot;key(&#39;carsgroup&#39;, concat(Cars, &#39;|&#39;, Date))&quot;&gt;
			&lt;xsl:value-of select=&quot;position()&quot;/&gt;
			&lt;xsl:text&gt;&amp;#9;&lt;/xsl:text&gt;
			&lt;xsl:value-of select=&quot;Time&quot;/&gt;
			&lt;xsl:text&gt;&amp;#9;&lt;/xsl:text&gt;
			&lt;xsl:value-of select=&quot;avg&quot;/&gt;
			&lt;xsl:text&gt;&amp;#10;&lt;/xsl:text&gt;
		&lt;/xsl:for-each&gt;  	
	&lt;/xsl:for-each&gt;            
&lt;/xsl:template&gt;

&lt;/xsl:stylesheet&gt;

huangapple
  • 本文由 发表于 2023年5月28日 18:45:08
  • 转载请务必保留本文链接:https://go.coder-hub.com/76351074.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定