我需要使用id元素将xml元素注入另一个xml元素中以加入。
例如:
<root>
<a>
<id>1</id>
<!-- other elements ... -->
</a>
<a>
<id>2</id>
<!-- other elements ... -->
</a>
<b>
<id>10</id>
<ref>1</ref>
<!-- other elements ... -->
</b>
<b>
<id>13</id>
<ref>2</ref>
<!-- other elements ... -->
</b>
<b>
<id>13</id>
<ref>1</ref>
<!-- other elements ... -->
</b>
</root>
我需要转变为:
<root>
<a>
<id>1</id>
<!-- other elements ... -->
<b>
<id>10</id>
<ref>1</ref>
<!-- other elements ... -->
</b>
<b>
<id>13</id>
<ref>1</ref>
<!-- other elements ... -->
</b>
</a>
<a>
<id>2</id>
<!-- other elements ... -->
<b>
<id>13</id>
<ref>2</ref>
<!-- other elements ... -->
</b>
</a>
</root>
在这种情况下,当 a / id 等于 b / ref 时,我将b元素加入元素。
是否可以使用XSLT进行此类转换?我该怎么办?
答案 0 :(得分:6)
首先从身份模板开始,按原样将节点复制到输出文档
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
要通过参考高效查找 b 元素,请考虑创建密钥:
<xsl:key name="b" match="b" use="ref" />
然后,您可以使用模板来匹配 a 元素,您可以正常输出 a 元素,并复制关联的 b 元素,使用键
<xsl:template match="a">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<xsl:copy-of select="key('b', id)" />
</xsl:copy>
</xsl:template>
最后,你需要一个模板来阻止身份模板正常输出 b 元素:
<xsl:template match="b" />
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="b" match="b" use="ref" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="a">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<xsl:copy-of select="key('b', id)" />
</xsl:copy>
</xsl:template>
<xsl:template match="b" />
</xsl:stylesheet>