0

我有两个 XML

File1.xml 它包含需要多次复制的 IP 映射并将值替换为给定的值。

    <baseNode>
            <internal ip="192.168.1.1">
                    <someOtherTags>withsome values which should not be changed</someOtherTags>
            </internal>
            <internal ip="192.168.1.2">
                    <someOtherTags>withsome more values which should not be changed</someOtherTags>
            </internal>
    </baseNode>

文件2.xml

    <IPMappings>
    <sourceIP value="192.168.1.1">
            <replacement>10.66.33.22</replacement>
            <replacement>10.66.33.44</replacement>
    </sourceIP>
    <sourceIP value="192.168.1.2">
            <replacement>10.66.34.22</replacement>
            <replacement>10.66.34.44</replacement>
    </sourceIP>
    </IPMappings>

生成的 XML 应该是:

    <baseNode>
            <internal ip="10.66.33.22">
                    <someOtherTags>withsome values which should not be changed</someOtherTags>
            </internal>
            <internal ip="10.66.33.44">
                    <someOtherTags>withsome values which should not be changed</someOtherTags>
            </internal>

            <internal ip="10.66.34.22">
                    <someOtherTags>withsome more values which should not be changed</someOtherTags>
            </internal>
            <internal ip="10.66.34.44">
                    <someOtherTags>withsome more values which should not be changed</someOtherTags>
            </internal>
    </baseNode>

我如何使用 XSLT 来做到这一点?

4

1 回答 1

1

这是我的建议,第一个文档是主输入文档,第二个文档作为参数传入:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

<xsl:param name="map-doc-url" select="'File2.xml'"/>
<xsl:variable name="map-doc" select="document($map-doc-url)"/>

<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="ip" match="sourceIP" use="@value"/>

<xsl:template match="baseNode">
  <xsl:copy>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

<xsl:template match="baseNode/internal">
  <xsl:variable name="this" select="."/>
  <xsl:for-each select="$map-doc">
    <xsl:apply-templates select="key('ip', $this/@ip)/replacement">
      <xsl:with-param name="internal" select="$this"/>
    </xsl:apply-templates>
  </xsl:for-each>
</xsl:template>

<xsl:template match="sourceIP/replacement">
  <xsl:param name="internal"/>
  <internal ip="{.}">
    <xsl:copy-of select="$internal/node()"/>
  </internal>
</xsl:template>

</xsl:stylesheet>

当我使用 Saxon 6.5.5 在上面运行时,我得到以下结果:

<baseNode>
   <internal ip="10.66.33.22">
      <someOtherTags>withsome values which should not be changed</someOtherTags>
   </internal>
   <internal ip="10.66.33.44">
      <someOtherTags>withsome values which should not be changed</someOtherTags>
   </internal>
   <internal ip="10.66.34.22">
      <someOtherTags>withsome more values which should not be changed</someOtherTags>
   </internal>
   <internal ip="10.66.34.44">
      <someOtherTags>withsome more values which should not be changed</someOtherTags>
   </internal>
</baseNode>
于 2012-12-28T10:07:14.947 回答