使用 XSLT 从一个 XML 中提取值,同时在另一个 XML 中匹配模板
Extract value from one XML while matching template in other XML using XSLT
我有 2 个 XML。我正在尝试 运行 XSLT on 1st XML 并在 2nd XML 中使用键匹配数据。在第 2 个 XML 上执行 模板匹配 时,我无法从第一个 XML 的匹配节点中提取数据(不知道如何从那里提取任何数据每说)并在那里填充它。以下是示例和预期输出。
第一 XML-
<parent>
<child>
<name>John</name>
<city>Boston</city>
<shortCityCode>B</shortCityCode>
</child>
<child>
<name>John</name>
<city>Seattle</city>
<shortCityCode>S</shortCityCode>
</child>
<child>
<name>Allison</name>
<city>Houston</city>
<shortCityCode>H</shortCityCode>
</child>
</parent>
第二个 XML - 在 XSLT 中作为变量内联
XSLT 尝试-
<?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="{shortCityCode}"> //Here I want to populate the value from 1st XML
<xsl:value-of select="code"/>
</city>
</xsl:template>
</xsl:stylesheet>
我需要提取 shortCityCode 字段并填充到上述 XSLT 的第二个模板调用中。下面是上面 XSLT 的代码片段,它需要 -
<xsl:template match="detail">
<city value="{shortCityCode}"> //shortCityCode from 1st XML where key is matching the values.
<xsl:value-of select="code"/>
</city>
</xsl:template>
预期输出 -
<FinalData>
<Data>
<name>John</name>
<details>
<detail>
<city value="B">abc</city>
</detail>
<detail>
<city value="B">abc</city>
<city value="S">mno</city>
</detail>
<detail>
<city value="S">mno</city>
</detail>
</details>
</Data>
<Data>
<name>Allison</name>
<details>
<detail>
<city value="H">xyz</city>
</detail>
<detail>
<city value="H">xyz</city>
</detail>
</details>
</Data>
</FinalData>
我认为您需要将模板更改为
<xsl:template match="detail">
<city value="{current-group()[city = current()/city]/shortCityCode}">
<xsl:value-of select="code"/>
</city>
</xsl:template>
我有 2 个 XML。我正在尝试 运行 XSLT on 1st XML 并在 2nd XML 中使用键匹配数据。在第 2 个 XML 上执行 模板匹配 时,我无法从第一个 XML 的匹配节点中提取数据(不知道如何从那里提取任何数据每说)并在那里填充它。以下是示例和预期输出。
第一 XML-
<parent>
<child>
<name>John</name>
<city>Boston</city>
<shortCityCode>B</shortCityCode>
</child>
<child>
<name>John</name>
<city>Seattle</city>
<shortCityCode>S</shortCityCode>
</child>
<child>
<name>Allison</name>
<city>Houston</city>
<shortCityCode>H</shortCityCode>
</child>
</parent>
第二个 XML - 在 XSLT 中作为变量内联
XSLT 尝试-
<?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="{shortCityCode}"> //Here I want to populate the value from 1st XML
<xsl:value-of select="code"/>
</city>
</xsl:template>
</xsl:stylesheet>
我需要提取 shortCityCode 字段并填充到上述 XSLT 的第二个模板调用中。下面是上面 XSLT 的代码片段,它需要 -
<xsl:template match="detail">
<city value="{shortCityCode}"> //shortCityCode from 1st XML where key is matching the values.
<xsl:value-of select="code"/>
</city>
</xsl:template>
预期输出 -
<FinalData>
<Data>
<name>John</name>
<details>
<detail>
<city value="B">abc</city>
</detail>
<detail>
<city value="B">abc</city>
<city value="S">mno</city>
</detail>
<detail>
<city value="S">mno</city>
</detail>
</details>
</Data>
<Data>
<name>Allison</name>
<details>
<detail>
<city value="H">xyz</city>
</detail>
<detail>
<city value="H">xyz</city>
</detail>
</details>
</Data>
</FinalData>
我认为您需要将模板更改为
<xsl:template match="detail">
<city value="{current-group()[city = current()/city]/shortCityCode}">
<xsl:value-of select="code"/>
</city>
</xsl:template>