我有以下XML结构:
<file>
<root1>
<object1 id="abc" info="blah"/>
<object1 id="def" info="blah blah"/>
</root1>
<root2>
<object2 id="abc" x="10" y="20"/>
<object2 id="def" x="30" y="40""/>
</root2>
</file>
我希望将其转换(合并)为以下结构:
<file>
<root>
<object id="abc" info="blah" x="10" y="20"/>
<object id="def" info="blah blah" x="30" y="40"/>
</root>
</file>
对于相同的id,我们可以假设没有重复的节点或属性。
目前,我使用object1
在整个<xsl:for-each ...>
集合中循环播放,但我无法弄清楚如何使其发挥作用:
<xsl:for-each select="file/root1/object1">
<object>
<xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
<xsl:attribute name="info"><xsl:value-of select="@info"/></xsl:attribute>
<xsl:attribute name="x">???</xsl:attribute>
<xsl:attribute name="y">???</xsl:attribute>
</object>
</xsl:for-each>
即。我需要使用当前所选@id
的{{1}}作为<object1>
上xpath查询的输入,位于<object2>
的属性中。
我看过this,this,this,this,this和this,但他们已经看过有点不同,在我的情况下,我无法看到我如何使用它。
答案 0 :(得分:2)
以下样式表:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="object2" match="object2" use="@id" />
<xsl:template match="/">
<file>
<root>
<xsl:for-each select="file/root1/object1">
<object>
<xsl:copy-of select="@* | key('object2', @id)/@*"/>
</object>
</xsl:for-each>
</root>
</file>
</xsl:template>
</xsl:stylesheet>
当应用于您的输入示例(校正良好格式)时,将产生:
<?xml version="1.0" encoding="UTF-8"?>
<file>
<root>
<object id="abc" info="blah" x="10" y="20"/>
<object id="def" info="blah blah" x="30" y="40"/>
</root>
</file>
很明显,这里假设两个根分支之间存在1:1的对应关系。