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