xslt:使用递归

时间:2018-06-17 17:16:30

标签: xml xslt

考虑以下两个文件:

file1.xml:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <foo>
        <bar1 id="1">
            <el1 id="1.1">Bar1 el1</el1>
            <el2 nil="yes" />
        </bar1>
        <bar2 id="2" nil="yes" />
        <bar3 id="3">
            <el1>Bar3 el1</el1>
            <el2>
                <someValue1>5</someValue1>
            </el2>
        </bar3>
    </foo>
</root>

file2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<trunk>
    <bar2 id="2">
        <someValue2>11</someValue2>
    </bar2>
    <bar3 id="3">
        <el2>
            <someValue3>8</someValue3>
        </el2>
    </bar3>
</trunk>

我想将这两个文件合并为以下规则: - 应该添加File2(trunk)来覆盖File1(root / foo)中的数据; - 如果File1中已存在元素,则只应替换现有数据,但应保留所有子元素。这种情况的结果应该是:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <foo>
        <bar1 id="1">
            <el1 id="1.1">Bar1 el1</el1>
            <el2 nil="yes"/>
        </bar1>
        <bar2 id="2">
            <someValue2>11</someValue2>
        </bar2>
        <bar3 id="3">
            <el1>Bar3 el1</el1>
            <el2>
                <someValue1>5</someValue1>
                <someValue3>8</someValue3>
            </el2>
        </bar3>
    </foo>
</root>

我已经能够创建一个接近但是bar3 / el2元素出现两次的xslt文件。当然,我可以更深入1级,但不应限制bar3(或任何其他元素)的子元素的嵌套。这是我到目前为止尝试的xlst:              

  <xsl:variable name="supplement" select="document('file2.xml')" />

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="foo//*[@id]" >
     <xsl:variable name="sup-element" select="$supplement//*[@id=current()/@id]"/>
      <xsl:choose>
        <xsl:when test="$sup-element">
            <xsl:element name="{name()}" >
                <xsl:apply-templates select="$sup-element/@*"/>
                <xsl:apply-templates select="./*|$sup-element/*"/>
            </xsl:element>
        </xsl:when>
        <xsl:otherwise>
                <xsl:copy>
                <xsl:apply-templates select="@*|node()" />
                </xsl:copy>
        </xsl:otherwise>
      </xsl:choose>
  </xsl:template>

我找到了一些使用嵌套合并元素的例子,但由于我对xslt的经验不多,我可以使用一些帮助。

0 个答案:

没有答案