2

XSLを使用して、2つのファイルを比較し、出力ファイルを生成したいと思います。

ファイル1:

<SalesExtractProcess>
  <PackageFormatVersion>3</PackageFormatVersion>
  <VersionComments></VersionComments>
  <CreatorName>Demouser</CreatorName>
  <CreatorComputerName>DemoComputer</CreatorComputerName>
  <CreationDate>10/1/2012 9:00:09 AM</CreationDate>
  <PackageType>5</PackageType>
  <Configurations>
    <SalesConfigurations>
      <ConfigurationType>1</ConfigurationType>
      <ConfigurationString>SalesExtractPackageConfig.dtsConfig</ConfigurationString>
      <ConfigurationVariable></ConfigurationVariable>
    </SalesConfigurations>
  </Configurations>
<SalesExtractProcess>

ファイル2:

<Package>
    <PackageFormatVersion checked="false">3</PackageFormatVersion>
    <VersionComments checked="false"></VersionComments>
    <CreatorName checked="true">Testuser</CreatorName>
    <CreatorComputerName checked="true">TestComputer</CreatorComputerName>
    <CreationDate checked="true">10/1/2012 9:00:09 AM</CreationDate>
    <PackageType checked="false">5</PackageType>
    <Configurations>
        <Config>
            <ConfigurationType checked="false">1</ConfigurationType>
            <ConfigurationString checked="true">Package.dtsConfig</ConfigurationString>
            <ConfigurationVariable checked="false"></ConfigurationVariable>
        </Config>
    </Configurations>
<Connections>
    <LocalHost.AdventureWorks>
        <ObjectName  checked="true">LocalHost.AdventureWorks</ObjectName>
    </LocalHost.AdventureWorks>
</Connections>
</Package>  

ファイル1とファイル2を比較し、ファイル1から、属性checked = "true"を持つすべての一致するノード(パスに関係なく)を結果ファイルに出力します。結果ファイルは次のようになります

結果ファイル:

<SalesExtractProcess>
    <CreatorName>Demouser</CreatorName>
    <CreatorComputerName>DemoComputer</CreatorComputerName>
    <CreationDate>10/1/2012 9:00:09 AM</CreationDate>
    <Configurations>
      <SalesConfigurations>
         <ConfigurationString>SalesExtractPackageConfig.dtsConfig</ConfigurationString>
      </SalesConfigurations>
    </Configurations>
<SalesExtractProcess>

このタスク用にxslを作成する方法がわかりませんでした。どんな助けでもいただければ幸いです。

4

1 に答える 1

1

以下のテンプレートは、「master」テンプレート(file2)で定義されdocument()た要素を除外するテンプレートと、他の属性をコピーする部分IDテンプレートを使用して、トリックを実行する必要があります。checked='false'ラッパー要素(例:Configurations / SalesConfigurations)をコピーするために、checked='false')を持つ要素のみを除外します。

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

    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />

    <xsl:template match="/">
        <xsl:apply-templates select="document('file1.xml')/node()" />
    </xsl:template>

    <!--Partial identity - just copy attributes-->
    <xsl:template match="@*">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
        </xsl:copy>
    </xsl:template>

    <!--Element filter - just elements which don't have @checked='false'-->
    <xsl:template match="*" xml:space="default">
        <xsl:variable name="eleToCheck" select="local-name()"/>
        <xsl:if test="not(document('file2.xml')//*[local-name() = $eleToCheck and @checked='false'])">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()" />
            </xsl:copy>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

出力:

<SalesExtractProcess>


    <CreatorName>Demouser</CreatorName>
    <CreatorComputerName>DemoComputer</CreatorComputerName>
    <CreationDate>10/1/2012 9:00:09 AM</CreationDate>

    <Configurations>
        <SalesConfigurations>

            <ConfigurationString>SalesExtractPackageConfig.dtsConfig</ConfigurationString>

        </SalesConfigurations>
    </Configurations>
</SalesExtractProcess>
于 2012-10-26T11:32:04.487 に答える