gpt4 book ai didi

xml - XSLT:合并元素而不重复

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

我想将一些元素从 XML 转换为文本,但要避免输出中出现重复项。XML 应该是这样的:

<A>
<B>
<param1>value0</param1>
<param2>value1</param2>
</B>
<B>
<param1>value2</param1>
<param2>value3</param2>
</B>
<C>
<param3>valueC1</param3>
<D>
<param4>value0</param4>
<param5>value4</param5>
</D>
<D>
<param4>value0</param4>
<param5>value5</param5>
</D>
<D>
<param4>value2</param4>
<param5>value6</param5>
</D>
</C>
<C>
<param3>valueC2</param3>
<D>
<param4>value0</param4>
<param5>value5</param5>
</D>
</C>
</A>

输出:

OBJECT: param1=value0, param2=value1, param3=valueC1, param4=value0;
OBJECT: param1=value2, param2=value3, param3=valueC1, param4=value2;
OBJECT: param1=value0, param2=value1, param3=valueC2, param4=value0;

注意事项:

  • 对于每个 D 对象,使用 D.param4 = B.param1 寻找与 B 对象的匹配
  • 如果同一个 C 中有两个或多个 D 对象并与同一个 B 匹配,则只打印其中一个(在示例中,不对第二个 D 对象执行任何操作,因为它会产生与第一个相同的行一)
  • 如果有两个 D 对象与相同的 B 匹配,但在不同的 C 中,则打印两者(输出示例中的第三行)

我找了一些类似的问题,但在相同的情况下找不到。

我想这可以通过使用键来完成,但它太复杂了。

谢谢!

问候,啤酒。

PS:对不起我的英语。

最佳答案

鉴于您没有在输出中使用任何param5,似乎可以将问题简化为

  • 对于每个 C
    • 找到所有 distinct B 元素,其 param1任何包含的 D 的 param4 匹配
    • 对于每一个
      • 再次提取 B/param1、B/param2、currentC/param3、B/param1(但标记为 param4)

这是使用模板实现这一目标的一种方法。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" />
<xsl:key name="BbyParam1" match="B" use="param1" />

<xsl:template match="/">
<xsl:apply-templates select="A/C" />
</xsl:template>

<xsl:template match="C">
<xsl:apply-templates select="key('BbyParam1', D/param4)">
<xsl:with-param name="currentC" select="." />
</xsl:apply-templates>
</xsl:template>

<xsl:template match="B">
<xsl:param name="currentC" />
<xsl:text>OBJECT: param1=</xsl:text>
<xsl:value-of select="param1" />
<xsl:text>, param2=</xsl:text>
<xsl:value-of select="param2" />
<xsl:text>, param3=</xsl:text>
<xsl:value-of select="$currentC/param3" />
<xsl:text>, param4=</xsl:text>
<xsl:value-of select="param1" />
<xsl:text>&#10;</xsl:text>
</xsl:template>
</xsl:stylesheet>

“找到所有 distinct B 元素,其 param1any 包含的 Ds 的 param4 匹配”是实际上非常简单,因为当您将节点集作为第二个参数传递给 key 函数时,它正是这样做的 - 它返回所有节点的集合,其键值为 < 的字符串值em>任何参数节点集中的节点,并且返回的节点集(作为一个集合)保证不包含重复项。

关于xml - XSLT:合并元素而不重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14852096/

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