XSLT:将元素注入另一个元素

时间:2014-06-15 10:55:27

标签: xslt xslt-2.0

我需要使用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进行此类转换?我该怎么办?

1 个答案:

答案 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>