基于2个XML创建XML,并使用XSLT2.0在这两个文件中查找值 [英] Create XML based on 2 XMLs and looking up values in both files using XSLT2.0
本文介绍了基于2个XML创建XML,并使用XSLT2.0在这两个文件中查找值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试基于另外两个XMLs生成一个XML。我正在轮询一个返回人员详细信息的数据库(查询中可以返回n个人)。最终的XML应该具有与来自数据库的XML中的不同的名称标记相同的数据标记的确切数量。具体地址:
第1个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>
</parent>
第2个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>
首先,我需要创建两个数据标记,因为有两个不同的名字-John和Allison(这部分已经完成,运行良好)。
然后,我需要检查John,无论返回的DB行中存在什么唯一的城市标记。让我们考虑第一个XML,我们有与波士顿和西雅图相关的John。因此,我将一个接一个地检查第二个XML中的这些城市,对于我匹配的每个父标记,我将创建一个新标记详细信息并粘贴所有相关内容。
1)如果没有匹配条目,则不应创建详细信息标记,因为没有匹配条目。
2)城市标记将位于父标记下。城市标记的值在父标记中是唯一的。我必须在第二个XML中逐个匹配城市,并从第二个XML中所有父级的所有匹配的城市标记中获取值,并以这样的方式填充:任何与父级标记中匹配的内容都将放入输出XML中相应的Detail标记中。Pfb示例XML,这将更好地解释-
最终预期的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产生了如下结果-
<FinalData>
<Data>
<name>John</name>
<details>
<detail>
<city value="Boston">abc</city>
<city value="Boston">abc</city>
<city value="Seattle">mno</city>
<city value="Seattle">mno</city>
</detail>
</details>
</Data>
<Data>
<name>Allison</name>
<details>
<detail>
<city value="Houston">xyz</city>
<city value="Houston">xyz</city>
</detail>
</details>
</Data>
</FinalData>
希望这一点很清楚,因为我不擅长解释。
推荐答案
使用键解析交叉引用:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:param name="details">
<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>
</xsl:param>
<xsl:key name="parent-ref" match="parent" use="detail/city"/>
<xsl:key name="detail-ref" match="parent/detail" use="city"/>
<xsl:output method="xml" indent="yes" />
<xsl:template match="parent">
<FinalData>
<xsl:for-each-group select="child" group-by="name">
<Data>
<xsl:copy-of select="name"/>
</Data>
<Details>
<xsl:apply-templates select="key('parent-ref', current-group()/city, $details)"/>
</Details>
</xsl:for-each-group>
</FinalData>
</xsl:template>
<xsl:template match="details/parent">
<detail>
<xsl:apply-templates select="key('detail-ref', current-group()/city, .)"/>
</detail>
</xsl:template>
<xsl:template match="detail">
<city value="{city}">
<xsl:value-of select="code"/>
</city>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/gVhDDyY
为完整起见,第二个文档是内联的,但您当然可以改用<xsl:param name="details" select="doc('details.xml')"/>
。
这篇关于基于2个XML创建XML,并使用XSLT2.0在这两个文件中查找值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文