我正在处理一个问题,并想知道如何使用XSLT(1.0)完成。我将来自2个XML文件的数据合并为一个。我必须将值从一个XML节点注入另一个XML节点。由于我的XML文件很大,我不必奢侈地在XSLT中创建元素。我只想以某种方式将它们从一个 data1 元素映射到 data2 元素。
输入:
<combinedData>
<data1>
<element1>
<id>12</id>
<name>Tony Green</name>
<address>Home Address</address>
</element1>
</data1>
<data2>
<element1>
<element2>
<element3>
<IdOfPerson></IdOfPerson>
<NameOfPerson></NameOfPerson>
<addressOfPerson></addressOfPerson>
</element3>
</element2>
</element1>
</data2>
期望输出:
<data2>
<element1>
<element2>
<element3>
<IdOfPerson>12</IdOfPerson>
<NameOfPerson>Tony Green</NameOfPerson>
<addressOfPerson>Home Address</addressOfPerson>
</element3>
</element2>
</element1>
对此的任何帮助都将受到高度赞赏。
答案 0 :(得分:0)
使用identity transform复制data2
:
<xsl:template match="/">
<xsl:apply-templates select="//data2"/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"></xsl:apply-templates>
</xsl:copy>
</xsl:template>
为element3
的子节点使用特定模板。我假设您要从同名data1/element1
的小写节点中复制数据:
<xsl:template match="element3/node()">
<xsl:variable name="name-without-of-person" select="substring-before(name(), 'OfPerson')" />
<xsl:variable name="lower-case" select="translate($name-without-of-person, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"/>
<!-- copy the original node -->
<xsl:copy>
<!-- XSLT 1.0 does not support XPath queries that are dynamically generated,
therefore, .../element1/$lower-case does not work.
However, using a predicate with a name() query works -->
<xsl:value-of select="/combinedData/data1/element1/*[name()=$lower-case]"/>
</xsl:copy>
</xsl:template>