将XML转换为文本文件

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

Transform XML to Text file

问题

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

输入XML:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <data>
  3. <item>
  4. <Date>2023-02-19</Date>
  5. <Cars>Ford</Cars>
  6. <SellTarget>A4+</SellTarget>
  7. <Time>10:40:09</Time>
  8. <avg>19.3464027998</avg>
  9. </item>
  10. <!-- 其他item节点 -->
  11. </data>

XSLT:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  3. <xsl:output method="text" encoding="UTF-8"/>
  4. <!-- XSLT 模板部分 -->
  5. </xsl:stylesheet>

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

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

我想要的输出:

  1. Ford / 2023-02-19 [ 50 Entrants ]
  2. 1 10:40:09 19.3464027998
  3. 2 11:21:56 32.7150023474
  4. 3 19:01:27 554.0289810087
  5. 4 23:15:26 46.1398232343
  6. Opel / 2023-02-19 [ 50 Entrants ]
  7. 1 02:00:00 1.2954721559
  8. 2 14:05:51 41.7428144493
  9. 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:

  1. &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
  2. &lt;data&gt;
  3. &lt;item&gt;
  4. &lt;Date&gt;2023-02-19&lt;/Date&gt;
  5. &lt;Cars&gt;Ford&lt;/Cars&gt;
  6. &lt;SellTarget&gt;A4+&lt;/SellTarget&gt;
  7. &lt;Time&gt;10:40:09&lt;/Time&gt;
  8. &lt;avg&gt;19.3464027998&lt;/avg&gt;
  9. &lt;/item&gt;
  10. &lt;item&gt;
  11. &lt;Date&gt;2023-02-19&lt;/Date&gt;
  12. &lt;Cars&gt;Ford&lt;/Cars&gt;
  13. &lt;SellTarget&gt;A4+&lt;/SellTarget&gt;
  14. &lt;Time&gt;11:21:56&lt;/Time&gt;
  15. &lt;avg&gt;32.7150023474&lt;/avg&gt;
  16. &lt;/item&gt;
  17. &lt;item&gt;
  18. &lt;Date&gt;2023-02-19&lt;/Date&gt;
  19. &lt;Cars&gt;Ford&lt;/Cars&gt;
  20. &lt;SellTarget&gt;A4+&lt;/SellTarget&gt;
  21. &lt;Time&gt;19:01:27&lt;/Time&gt;
  22. &lt;avg&gt;554.0289810087&lt;/avg&gt;
  23. &lt;/item&gt;
  24. &lt;item&gt;
  25. &lt;Date&gt;2023-02-19&lt;/Date&gt;
  26. &lt;Cars&gt;Ford&lt;/Cars&gt;
  27. &lt;SellTarget&gt;A4+&lt;/SellTarget&gt;
  28. &lt;Time&gt;23:15:26&lt;/Time&gt;
  29. &lt;avg&gt;46.1398232343&lt;/avg&gt;
  30. &lt;/item&gt;
  31. &lt;item&gt;
  32. &lt;Date&gt;2023-02-19&lt;/Date&gt;
  33. &lt;Cars&gt;Opel&lt;/Cars&gt;
  34. &lt;SellTarget&gt;A4+&lt;/SellTarget&gt;
  35. &lt;Time&gt;14:05:51&lt;/Time&gt;
  36. &lt;avg&gt;41.7428144493&lt;/avg&gt;
  37. &lt;/item&gt;
  38. &lt;item&gt;
  39. &lt;Date&gt;2023-02-19&lt;/Date&gt;
  40. &lt;Cars&gt;Opel&lt;/Cars&gt;
  41. &lt;SellTarget&gt;A4+&lt;/SellTarget&gt;
  42. &lt;Time&gt;15:01:02&lt;/Time&gt;
  43. &lt;avg&gt;65.6303001034&lt;/avg&gt;
  44. &lt;/item&gt;
  45. &lt;item&gt;
  46. &lt;Date&gt;2023-02-19&lt;/Date&gt;
  47. &lt;Cars&gt;Opel&lt;/Cars&gt;
  48. &lt;SellTarget&gt;A4+&lt;/SellTarget&gt;
  49. &lt;Time&gt;02:00:00&lt;/Time&gt;
  50. &lt;avg&gt;1.2954721559&lt;/avg&gt;
  51. &lt;/item&gt;
  52. &lt;/data&gt;

XSLT:

  1. &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
  2. &lt;xsl:stylesheet xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot; version=&quot;1.0&quot;&gt;
  3. &lt;xsl:output method=&quot;text&quot; encoding=&quot;UTF-8&quot;/&gt;
  4. &lt;xsl:key name=&quot;carsgroup&quot; match=&quot;/data/item&quot; use=&quot;concat(Cars, &#39;|&#39;, Date)&quot; /&gt;
  5. &lt;xsl:variable name=&quot;tab&quot; select=&quot;&#39;&amp;#09;&#39;&quot;/&gt;
  6. &lt;xsl:variable name=&quot;newLine&quot; select=&quot;&#39;&amp;#10;&#39;&quot;/&gt;
  7. &lt;xsl:variable name=&quot;csvSeparator&quot; select=&quot;$tab&quot;/&gt;
  8. &lt;xsl:template match=&quot;/&quot;&gt;
  9. &lt;xsl:call-template name=&quot;headerlines&quot;/&gt;
  10. &lt;xsl:apply-templates select=&quot;data/item[generate-id() = generate-id(key(&#39;carsgroup&#39;,
  11. concat(Cars, &#39;|&#39;, Date)))]&quot; mode=&quot;dataRows&quot;&gt;
  12. &lt;/xsl:apply-templates&gt;
  13. &lt;/xsl:template&gt;
  14. &lt;xsl:template name=&quot;headerlines&quot;&gt;
  15. &lt;!-- 1. line is Skipped --&gt;
  16. &lt;xsl:call-template name=&quot;csv&quot;&gt;
  17. &lt;xsl:with-param name=&quot;val&quot; select=&quot;&#39;&#39;&quot;/&gt;
  18. &lt;/xsl:call-template&gt;
  19. &lt;!-- 2. line is Skipped--&gt;
  20. &lt;xsl:call-template name=&quot;csv&quot;&gt;
  21. &lt;xsl:with-param name=&quot;val&quot; select=&quot;&#39;&#39;&quot;/&gt;
  22. &lt;/xsl:call-template&gt;
  23. &lt;!-- 3. line is Skipped --&gt;
  24. &lt;xsl:call-template name=&quot;csv&quot;&gt;
  25. &lt;xsl:with-param name=&quot;val&quot; select=&quot;&#39;&#39;&quot;/&gt;
  26. &lt;/xsl:call-template&gt;
  27. &lt;!-- 4. line is Skipped --&gt;
  28. &lt;xsl:call-template name=&quot;csv&quot;&gt;
  29. &lt;xsl:with-param name=&quot;val&quot; select=&quot;&#39;&#39;&quot;/&gt;
  30. &lt;xsl:with-param name=&quot;isLastCol&quot; select=&quot;true()&quot;/&gt;
  31. &lt;/xsl:call-template&gt;
  32. &lt;/xsl:template&gt;
  33. &lt;xsl:template match=&quot;item&quot; mode=&quot;dataRows&quot;&gt;
  34. &lt;!-- at 5. line the first 5 char is skipped --&gt;
  35. &lt;xsl:call-template name=&quot;csv&quot;&gt;
  36. &lt;xsl:with-param name=&quot;val&quot; select=&quot;concat(&#39; &#39;, Cars, &#39; / &#39;, Date, &#39; [ 50 Entrants ]&#39;)&quot;/&gt;
  37. &lt;/xsl:call-template&gt;
  38. &lt;!-- sequence number --&gt;
  39. &lt;xsl:call-template name=&quot;csv&quot;&gt;
  40. &lt;xsl:with-param name=&quot;val&quot; select=&quot;position()&quot;/&gt;
  41. &lt;/xsl:call-template&gt;
  42. &lt;!-- Time HH:MM:SS --&gt;
  43. &lt;xsl:call-template name=&quot;csv&quot;&gt;
  44. &lt;xsl:with-param name=&quot;val&quot; select=&quot;Time&quot;/&gt;
  45. &lt;/xsl:call-template&gt;
  46. &lt;!-- avg --&gt;
  47. &lt;xsl:call-template name=&quot;csv&quot;&gt;
  48. &lt;xsl:with-param name=&quot;val&quot; select=&quot;avg&quot;/&gt;
  49. &lt;xsl:with-param name=&quot;isLastCol&quot; select=&quot;true()&quot;/&gt;
  50. &lt;xsl:with-param name=&quot;isEOF&quot; select=&quot;position()=last()&quot;/&gt;
  51. &lt;/xsl:call-template&gt;
  52. &lt;/xsl:template&gt;
  53. &lt;xsl:template name=&quot;csv&quot;&gt;
  54. &lt;xsl:param name=&quot;val&quot;/&gt;
  55. &lt;xsl:param name=&quot;isLastCol&quot; select=&quot;false()&quot;/&gt;
  56. &lt;xsl:param name=&quot;isEOF&quot; select=&quot;false()&quot;/&gt;
  57. &lt;xsl:value-of select=&quot;$val&quot;/&gt;
  58. &lt;xsl:choose&gt;
  59. &lt;xsl:when test=&quot;$isLastCol and not($isEOF)&quot;&gt;
  60. &lt;xsl:value-of select=&quot;$newLine&quot;/&gt;
  61. &lt;/xsl:when&gt;
  62. &lt;xsl:when test=&quot;not($isEOF)&quot;&gt;
  63. &lt;xsl:value-of select=&quot;$csvSeparator&quot;/&gt;
  64. &lt;/xsl:when&gt;
  65. &lt;/xsl:choose&gt;
  66. &lt;/xsl:template&gt;
  67. &lt;/xsl:stylesheet&gt;

output text file atm:

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

What i want:

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

答案1

得分: 1

以下是您要的翻译内容:

  1. Muenchian分组通常分为两个阶段:首先,您识别每个组中的第一个项目并创建一个组;然后,您处理此组中的项目。您尝试的问题在于它缺少第二部分。
  2. 尝试调整这个**简化的**样式表:
  3. <xsl:stylesheet version="1.0"
  4. xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  5. <xsl:output method="text" encoding="UTF-8"/>
  6. <xsl:key name="carsgroup" match="item" use="concat(Cars, '|', Date)" />
  7. <xsl:template match="/data">
  8. <xsl:for-each select="item[generate-id() = generate-id(key('carsgroup', concat(Cars, '|', Date))[1])]">
  9. <!-- group header -->
  10. <xsl:value-of select="Cars"/>
  11. <xsl:text>/</xsl:text>
  12. <xsl:value-of select="Date"/>
  13. <xsl:text>&#10;</xsl:text>
  14. <!-- group items -->
  15. <xsl:for-each select="key('carsgroup', concat(Cars, '|', Date))">
  16. <xsl:value-of select="position()"/>
  17. <xsl:text>&#9;</xsl:text>
  18. <xsl:value-of select="Time"/>
  19. <xsl:text>&#9;</xsl:text>
  20. <xsl:value-of select="avg"/>
  21. <xsl:text>&#10;</xsl:text>
  22. </xsl:for-each>
  23. </xsl:for-each>
  24. </xsl:template>
  25. </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:

  1. &lt;xsl:stylesheet version=&quot;1.0&quot;
  2. xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;&gt;
  3. &lt;xsl:output method=&quot;text&quot; encoding=&quot;UTF-8&quot;/&gt;
  4. &lt;xsl:key name=&quot;carsgroup&quot; match=&quot;item&quot; use=&quot;concat(Cars, &#39;|&#39;, Date)&quot; /&gt;
  5. &lt;xsl:template match=&quot;/data&quot;&gt;
  6. &lt;xsl:for-each select=&quot;item[generate-id() = generate-id(key(&#39;carsgroup&#39;, concat(Cars, &#39;|&#39;, Date))[1])]&quot;&gt;
  7. &lt;!-- group header --&gt;
  8. &lt;xsl:value-of select=&quot;Cars&quot;/&gt;
  9. &lt;xsl:text&gt;/&lt;/xsl:text&gt;
  10. &lt;xsl:value-of select=&quot;Date&quot;/&gt;
  11. &lt;xsl:text&gt;&amp;#10;&lt;/xsl:text&gt;
  12. &lt;!-- group items --&gt;
  13. &lt;xsl:for-each select=&quot;key(&#39;carsgroup&#39;, concat(Cars, &#39;|&#39;, Date))&quot;&gt;
  14. &lt;xsl:value-of select=&quot;position()&quot;/&gt;
  15. &lt;xsl:text&gt;&amp;#9;&lt;/xsl:text&gt;
  16. &lt;xsl:value-of select=&quot;Time&quot;/&gt;
  17. &lt;xsl:text&gt;&amp;#9;&lt;/xsl:text&gt;
  18. &lt;xsl:value-of select=&quot;avg&quot;/&gt;
  19. &lt;xsl:text&gt;&amp;#10;&lt;/xsl:text&gt;
  20. &lt;/xsl:for-each&gt;
  21. &lt;/xsl:for-each&gt;
  22. &lt;/xsl:template&gt;
  23. &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:

确定