0

2 つの 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>

File2.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

これが私の提案です。最初のドキュメントはプライマリ入力ドキュメントで、2 番目のドキュメントはパラメーターとして渡されます。

<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 に答える