【发布时间】:2020-04-06 17:21:01
【问题描述】:
我正在尝试生成基于其他 2 个 XML 的 XML。我正在轮询一个返回人员详细信息的数据库(查询中可以返回 n 人)。 最终的 XML 应该具有与来自 DB 的 XML 中的 不同名称标签一样的确切数量的 数据标签。例如:
第一个 XML - 从 DB 获取它
<parent>
<child>
<name>John</name>
<city>Boston</city>
</child>
<child>
<name>John</name>
<city>Seattle</city>
</child>
<child>
<name>Allison</name>
<city>Houston</city>
</child>
<child>
<name>John</name>
<city>Boston</city>
</child>
</parent>
第二个 XML - 从另一个来源获取这个
<details>
<detail>
<city>Boston</city>
<code>abc</code>
</detail>
<detail>
<city>Houston</city>
<code>xyz</code>
</detail>
</details>
首先我需要创建 2 个数据标签,因为有 2 个不同的名称(John 和 Allison),然后我需要一一检查所有 child 的 City 标签是否第一个 XML 中的 strong> 标签与第二个 XML 中的 匹配,然后创建 Details 标签并在最终 XML 中复制 Code 标签及其值。
1) 如果没有匹配的条目,则不应创建详细信息标签,因为没有匹配的条目。 2)不,永远不会有多个匹配条目。数据标签应基于 Distinct NAME 标签和 details 标签基于匹配城市标签的数量。
最终生成的 XML
<FinalData>
<Data>
<name>John</name>
<details>
<city>Boston</city>
<code>xyz</code>
</details>
</Data>
<Data>
<name>Allison</name>
<details>
<city>Houston</city>
<code>abc</code>
</details>
</Data>
</FinalData>
编辑 1:
我在填充 代码标记 时遇到问题,因为我必须匹配两个 XML 中的 城市标记,并且需要一个 for 循环进行匹配。
以下是我的尝试 -
<?xml version="1.0" encoding="UTF-8"?>
<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:param name="otherFile" select="document('SOF Input 2.xml')"/>
<xsl:template match="parent">
<FinalData>
<xsl:for-each-group select="child" group-by="name">
<data>
<name>
<xsl:value-of select="name"/>
</name>
<details>
<city>
<xsl:value-of select="city"/>
</city>
<code>
<xsl:for-each select="$otherFile/details/detail">
<xsl:if test="parent/child/city='/city'">
<!--I am getting stuck here - not able to get value here..i guess both city tags are referring to the same-->
<xsl:value-of select="/code"/>
</xsl:if>
</xsl:for-each>
</code>
</details>
</data>
<xsl:text>
</xsl:text>
</xsl:for-each-group>
</FinalData>
</xsl:template>
</xsl:stylesheet>
我得到以下输出 -
<?xml version="1.0" encoding="UTF-8"?>
<FinalData><data>
<name>John</name>
<details>
<city>Boston</city>
<code/>
</details>
</data>
<data>
<name>Allison</name>
<details>
<city>Houston</city>
<code/>
</details>
</data>
</FinalData>
它的缩进也有点错误。如果我遗漏了什么,请告诉我。
编辑 2:
恐怕迈克尔提到的情况比预期的要早得多。 city 标签将重复出现,但位于 parent 标签之下。 city 标签的值在 parent 标签内是唯一的。我必须从所有匹配的 city 标记中一个接一个地获取所有父母的值,并以 parent 标记中匹配的任何内容进入相应 detail 标记。 PFB 示例 XML,可以更好地解释 -
第一个 XML -
<parent>
<child>
<name>John</name>
<city>Boston</city>
</child>
<child>
<name>John</name>
<city>Seattle</city>
</child>
<child>
<name>Allison</name>
<city>Houston</city>
</child>
<child>
<name>John</name>
<city>Boston</city>
</child>
</parent>
第二个 XML-
<details>
<parent>
<detail>
<city>Boston</city>
<code>abc</code>
</detail>
<detail>
<city>Houston</city>
<code>xyz</code>
</detail>
</parent>
<parent>
<detail>
<city>Boston</city>
<code>abc</code>
</detail>
<detail>
<city>Seattle</city>
<code>mno</code>
</detail>
</parent>
<parent>
<detail>
<city>Houston</city>
<code>xyz</code>
</detail>
<detail>
<city>Seattle</city>
<code>mno</code>
</detail>
</parent>
</details>
最终预期的 XML-
<FinalData>
<Data>
<name>John</name>
<details>
<detail>
<city value="Boston">abc</city>
</detail>
<detail>
<city value="Boston">abc</city>
<city value="Seattle">mno</city>
</detail>
<detail>
<city value="Seattle">mno</city>
</detail>
</details>
</Data>
<Data>
<name>Allison</name>
<details>
<detail>
<city value="Houston">xyz</city>
</detail>
<detail>
<city value="Houston">xyz</city>
</detail>
</details>
</Data>
</FinalData>
希望这很清楚,因为我不擅长解释。
【问题讨论】:
-
那么您的 XSLT 代码在哪里尝试使用
group-by对第一个输入进行分组?如果第二个 XML 中没有匹配的城市或匹配的城市不止一个,会发生什么情况? -
这很简单,使用
xsl:for-each-group来创建Data元素和key用于details。发布您的尝试,以便我们了解您的具体问题所在。 -
@michael.hor257k 我现在已经粘贴了我的尝试。不确定当前代码是否仅适用于这种情况或我的意图。 :) 另一个问题是比较两个 XML 中的城市标签并放置一个 for-each 我需要检查第二个 XML 中的所有城市标签。
-
@MartinHonnen 我现在已经发布了尝试。至于您的查询 - 第二个 XML 中总会有唯一的城市。不确定将来是否会发生这种情况,但目前还没有。 :)
-
@michael.hor257k 你能帮帮我吗?
标签: xml xslt xslt-2.0 xslt-grouping