【问题标题】:xslt 1.0 xml merging between 2 nodesxslt 1.0 xml在2个节点之间合并
【发布时间】:2020-05-13 12:58:38
【问题描述】:

你能帮我解决这个问题吗? 我一直在尝试根据 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>

在合并具有相同行/字段 [1] 作为键的行时,我应该有以下 XML 输出,但保留行之间的行/字段 [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>

如果你能告诉我如何解决这个问题,那就太好了:)! 非常感谢!

【问题讨论】:

  • 提示:这是一个分组问题。从这里开始:jenitennison.com/xslt/grouping/muenchian.html,如果您在实现中遇到特定问题,请返回。
  • 此外,从您的示例中不清楚当合并的行在同一字段中具有冲突的值时会发生什么。
  • @michael.hor257k 我确实尝试过使用 Muenchian 分组,但我成功的只是将双线与所有子节点字段放在一条大线上,但范围是输出中相同数量的子字段,并将字段 [2] / 字段 [3] 值放在一行中。在行之间具有相同字段 [1] 的条目上只能存在字段 [2] 或字段 [3]。不幸的是,我已经失去了所有尝试,现在我无法提供有效的 xsl。我一重做就回来。谢谢!

标签: xml xslt-1.0


【解决方案1】:

试试下面的样式表。它使用 Muenchian 方法通过第一个 field 的值对 lines 进行分组,然后在具有字符串值的相同位置使用该组的第一个 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>

【讨论】:

  • 非常感谢!它完全达到了我的目标!通过一些小的调整,我能够完成我的范围!
猜你喜欢
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多