xslt 1.0 xml 在 2 个节点之间合并

xslt 1.0 xml merging between 2 nodes

你能帮我解决这个问题吗? 我一直在尝试根据 xslt 1.0 中的键合并 2 xml 节点,但不幸的是我没有取得任何进展。

这是 XML 输入:

<?xml version="1.0" encoding="UTF-8"?>
<csv>
   <line>
      <field>DE</field>
      <field/>
      <field>DE:STN</field>
      <field/>
      <field/>
      <field/>
      <field/>
      <field/>
      <field/>
      <field/>
   </line>
   <line>
      <field>DE</field>
      <field>DE:MWST</field>
      <field/>
      <field/>
      <field/>
      <field/>
      <field/>
      <field/>
      <field/>
      <field/>
   </line>
   <line>
      <field>SI</field>
      <field/>
      <field>SI:MSPRS</field>
      <field/>
      <field/>
      <field/>
      <field/>
      <field/>
      <field/>
      <field/>
   </line>

   <line>
      <field>BE</field>
      <field>BE:BTW</field>
      <field/>
      <field/>
      <field/>
      <field/>
      <field/>
      <field/>
      <field/>
      <field/>
   </line>
</csv>

我应该在合并具有相同 line/field[1] 作为键的行时得到以下 XML 输出,但保留 line/field 值的顺序非常重要[i] 字里行间:

<?xml version="1.0" encoding="UTF-8"?>
<csv>
   <line>
      <field>DE</field>
      <field>DE:MWST</field>
      <field>DE:STN</field>
      <field/>
      <field/>
      <field/>
      <field/>
      <field/>
      <field/>
      <field/>
   </line>
   <line>
      <field>SI</field>
      <field/>
      <field>SI:MSPRS</field>
      <field/>
      <field/>
      <field/>
      <field/>
      <field/>
      <field/>
      <field/>
   </line>

   <line>
      <field>BE</field>
      <field>BE:BTW</field>
      <field/>
      <field/>
      <field/>
      <field/>
      <field/>
      <field/>
      <field/>
      <field/>
   </line>
</csv>

如果你能给我一个关于如何解决这个问题的提示,那就太好了:)! 非常感谢!

试试下面的样式表。它使用 Muenchian 方法按第一个 field 的值对 line 进行分组,然后用组中第一个 field 的值填充每个 field具有字符串值的相同位置。

XSLT 1.0

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

<xsl:key name="line" match="line" use="field[1]" />

<xsl:template match="/csv">
    <xsl:copy>
        <xsl:for-each select="line[count(. | key('line', field[1])[1]) = 1]">
            <xsl:copy>
                <xsl:variable name="current-group" select="key('line', field[1])" />
                <xsl:for-each select="field">
                    <xsl:variable name="i" select="position()" />
                    <xsl:copy>  
                        <xsl:value-of select="$current-group/field[$i][string()]"/>
                    </xsl:copy>
                </xsl:for-each>
            </xsl:copy>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>