我正在处理一个问题,想知道如何使用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>
如果有任何帮助,我将不胜感激。
使用恒等变换复制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>