使用 XSLT 合并具有相同 ID 及其值的节点 (XML)
Combine Nodes (XML) with the same ID and their values using XSLT
我是 XSLT 的新手,我仍在学习中。我目前面临一个问题,我需要合并具有相同 ID 的节点。具有相同ID的节点将具有不同的值,这些值也需要合并。
下面是我的初始样本XML:
<OBR>
<row>
<ID>T084</ID>
<col2>Y</col2>
<col3></col3>
<col4></col4>
</row>
<row>
<ID>T084</ID>
<col2></col2>
<col3>Y</col3>
<col4></col4>
</row>
<row>
<ID>123456</ID>
<col2></col2>
<col3>Y</col3>
<col4></col4>
</row>
</OBR>
假设我需要用“N”填充空值,我的期望输出将是:
<OBR>
<row>
<ID>T084</ID>
<col2>Y</col2>
<col3>Y</col3>
<col4>N</col4>
</row>
<row>
<ID>125659</ID>
<col2>N</col2>
<col3>Y</col3>
<col4>N</col4>
</row>
</OBR>
任何人都可以指出我正确的方向吗?提前谢谢你。
看来您需要分两级进行分组:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/OBR">
<xsl:copy>
<xsl:for-each-group select="row" group-by="ID">
<xsl:copy>
<xsl:for-each-group select="current-group()/*" group-by="name()">
<xsl:element name="{current-grouping-key()}">
<xsl:value-of select="(current-group()/text(), 'N')[1]"/>
</xsl:element>
</xsl:for-each-group>
</xsl:copy>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我是 XSLT 的新手,我仍在学习中。我目前面临一个问题,我需要合并具有相同 ID 的节点。具有相同ID的节点将具有不同的值,这些值也需要合并。
下面是我的初始样本XML:
<OBR>
<row>
<ID>T084</ID>
<col2>Y</col2>
<col3></col3>
<col4></col4>
</row>
<row>
<ID>T084</ID>
<col2></col2>
<col3>Y</col3>
<col4></col4>
</row>
<row>
<ID>123456</ID>
<col2></col2>
<col3>Y</col3>
<col4></col4>
</row>
</OBR>
假设我需要用“N”填充空值,我的期望输出将是:
<OBR>
<row>
<ID>T084</ID>
<col2>Y</col2>
<col3>Y</col3>
<col4>N</col4>
</row>
<row>
<ID>125659</ID>
<col2>N</col2>
<col3>Y</col3>
<col4>N</col4>
</row>
</OBR>
任何人都可以指出我正确的方向吗?提前谢谢你。
看来您需要分两级进行分组:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/OBR">
<xsl:copy>
<xsl:for-each-group select="row" group-by="ID">
<xsl:copy>
<xsl:for-each-group select="current-group()/*" group-by="name()">
<xsl:element name="{current-grouping-key()}">
<xsl:value-of select="(current-group()/text(), 'N')[1]"/>
</xsl:element>
</xsl:for-each-group>
</xsl:copy>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>