gpt4 book ai didi

xml - XSLT 去规范化/透视/展平 xml 文件?第2部分

转载 作者:数据小太阳 更新时间:2023-10-29 02:23:14 25 4
gpt4 key购买 nike

(注意:我已经按照建议在 my earlier question 上发布了一个变体)

给定一个具有以下结构的输入 xml 文件:

  <widgets>
<widget shape="square" material="wood" color="red" />
<widget shape="square" material="metal" color="blue" />
<widget shape="square" material="plastic" color="green" />
<widget shape="square" material="kevlar" color="red" />
<widget shape="round" material="metal" color="orange" />
<widget shape="round" material="wood" color="green" />
<widget shape="round" material="kevlar" color="blue" />
<widget shape="diamond" material="plastic" color="blue" />
<widget shape="diamond" material="wood" color="brown" />
<widget shape="diamond" material="metal" color="red" />
</widgets>

以及以下信息:

  1. 每个小部件都有形状、 Material 和颜色
  2. 每种形状、 Material 和颜色组合都是独一无二的
  3. 并非所有形状、 Material 和颜色的组合都存在,例如没有圆形的塑料小部件
  4. 可以有无限的形状、 Material 和颜色
  5. 所需的输出是一个表格,其中每一行代表一种形状,每一列代表一种 Material 。

如何使用 XSLT 输出以下结构?

  <table>
<tr id="diamond">
<td class="kevlar"></td>
<td class="metal red"></td>
<td class="plastic blue"></td>
<td class="wood brown"></td>
</tr>
<tr id="round">
<td class="kevlar blue"></td>
<td class="metal orange"></td>
<td class="plastic"></td>
<td class="wood green"></td>
</tr>
<tr id="square">
<td class="kevlar green"></td>
<td class="metal blue"></td>
<td class="plastic green"></td>
<td class="wood red"></td>
</tr>
</table>

最佳答案

这个转换:

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

<xsl:key name="kShapeByVal" match="@shape"
use="."/>

<xsl:key name="kMaterByVal" match="@material"
use="."/>

<xsl:key name="kcolorByVal" match="@color"
use="."/>

<xsl:key name="kColorByShapeAndMat" match="@color"
use="concat(../@shape, '+', ../@material)"/>

<xsl:variable name="vShapes" select=
"/*/*/@shape
[generate-id()
=
generate-id(key('kShapeByVal',.)[1])
]
"/>

<xsl:variable name="vMaterials" select=
"/*/*/@material
[generate-id()
=
generate-id(key('kMaterByVal',.)[1])
]
"/>

<xsl:variable name="vColors" select=
"/*/*/@color
[generate-id()
=
generate-id(key('kcolorByVal',.)[1])
]
"/>

<xsl:template match="/*">
<table>
<xsl:for-each select="$vShapes">
<xsl:sort select="."/>

<xsl:variable name="vShape" select="."/>

<tr id="{.}">
<xsl:for-each select="$vMaterials">
<xsl:sort select="."/>

<xsl:variable name="vMat" select="."/>

<xsl:variable name="vShapeMatColors" select=
"key('kColorByShapeAndMat',
concat($vShape, '+', $vMat)
)
"/>

<xsl:if test="not($vShapeMatColors)">
<td class="{$vMat}"></td>
</xsl:if>

<xsl:for-each select="$vShapeMatColors">
<td class="{concat($vMat, ' ', .)}"></td>
</xsl:for-each>

</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</xsl:template>

</xsl:stylesheet>

应用于提供的 XML 文档时:

<widgets>
<widget shape="square" material="wood" color="red" />
<widget shape="square" material="metal" color="blue" />
<widget shape="square" material="plastic" color="green" />
<widget shape="square" material="kevlar" color="red" />
<widget shape="round" material="metal" color="orange" />
<widget shape="round" material="wood" color="green" />
<widget shape="round" material="kevlar" color="blue" />
<widget shape="diamond" material="plastic" color="blue" />
<widget shape="diamond" material="wood" color="brown" />
<widget shape="diamond" material="metal" color="red" />
</widgets>

产生想要的结果:

<table>
<tr id="diamond">
<td class="kevlar"/>
<td class="metal red"/>
<td class="plastic blue"/>
<td class="wood brown"/>
</tr>
<tr id="round">
<td class="kevlar blue"/>
<td class="metal orange"/>
<td class="plastic"/>
<td class="wood green"/>
</tr>
<tr id="square">
<td class="kevlar red"/>
<td class="metal blue"/>
<td class="plastic green"/>
<td class="wood red"/>
</tr>
</table>

一切如何运作:

  1. 使用 Muenchian 方法进行分组,我们发现所有不同的形状、 Material 和颜色 -- 在变量 $vShapes 中, $vMaterials$vColors .

  2. 我们输出一个 <tr> 对于 $vShapes 中的每个值

  3. 对于 $vMaterials 中包含的所有可能 Material 我们输出一个或多个 <td>具有属性 class 的元素其值(value)在两种不同的情况下确定:

  4. 第一种情况是没有为这种形状和 Material 的组合指定颜色(key('kColorByShapeAndMat', concat($vShape, '+', $vMat) 为空)。在这种情况下,类属性仅包含 Material 。

  5. 第二种情况是为这种形状和 Material 的组合指定了一种或多种颜色。然后,对于每一种这样的颜色,一个单独的 <td>输出元素及其 class属性由 Material 和颜色的串联产生,以空格分隔。

关于xml - XSLT 去规范化/透视/展平 xml 文件?第2部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/774071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com