0

2 つの変数 (スキーマは異なるが、同じオブジェクトに関連するコンテンツを保持する) があり、Variable2 には存在しない Variable1 の値が必要なシナリオがあります。

ここで、
1 つの変数は既存のユーザーを保持し、もう 1 つの変数はフラット ファイルからのユーザーを保持します。

ここに2つの変数があります

フラットファイル入力からのユーザー:

<ReadUsersResponse>
    <tns:User>
        <tns:Name>aa1</tns:Name>
        <tns:EmailAddress>bb1</tns:EmailAddress>
    </tns:User>
    <tns:User>
        <tns:Name>aa2</tns:Name>
        <tns:EmailAddress>bb2</tns:EmailAddress>
    </tns:User>
</ReadUsersResponse>

既存のユーザー:

<ReadProjectCodesResponse>
    <ProjectCode>
        <CodeValue>aa3</CodeValue>
        <Description>bb3</Description>
        <ObjectId>1418</ObjectId>
    </ProjectCode>
    <ProjectCode>
        <CodeValue>aa1</CodeValue>
        <Description>bb1</Description>
        <ObjectId>1419</ObjectId>
    </ProjectCode>
</ReadProjectCodesResponse>

観察するとName、Variable1 は Variable2 に対応しCodeValueます。同様にEmail、Variable1 から Variable2 へDescription

variable2 に存在しないユーザーのリストを作成する必要があります。つまり、

  • Variable1 - Variable2 (つまりaa2、存在しない場合のみ)

結果を別の形式に変換します。

<tns:CreateActivityCodes>
    <tns:ActivityCode>
      <tns:CodeTypeObjectId>SomeConstantNumber(1280)</tns:CodeTypeObjectId>
      <tns:CodeValue>aa2</tns:CodeValue>
      <tns:Description>bb2</tns:Description>
    </tns:ActivityCode>
</tns:CreateActivityCodes>

私はこれについていくつかの作業を行ってきましたが、解決策を見つけることができませんでした。誰かが私に解決策を提供してくれますか?

4

1 に答える 1

1

名前空間プレフィックスの namespace-uri を定義し、tnsそれを "Variable1" XML とスタイルシートの両方に適用しました。実際の名前空間に一致するように調整する必要があります。

次のスタイルシートは、「Variable2」ファイルが「ReadProjectCodesResponse.xml」として保存されていることを前提としており、「Variable1」要素と「Variable2」要素の値を比較するためにdocument()関数でそれを読み取ります。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:tns="tns">
    <xsl:output indent="yes"/>

    <xsl:variable name="ProjectCodes"
                  select="document('ReadProjectCodesResponse.xml')/*/*"/>

    <xsl:template match="ReadUsersResponse">
        <tns:CreateActivityCode>
            <xsl:apply-templates select="tns:User"/>
        </tns:CreateActivityCode>
    </xsl:template>

    <xsl:template match="tns:User">
      <xsl:if test="not(tns:Name = $ProjectCodes/CodeValue)">
        <tns:ActivityCode>
          <tns:CodeTypeObjectId>SomeConstantNumber(1280)</tns:CodeTypeObjectId>
             <xsl:apply-templates select="@*|node()"/>
        </tns:ActivityCode>
      </xsl:if>
    </xsl:template>

    <xsl:template match="tns:Name">
        <tns:CodeValue>
            <xsl:apply-templates />
        </tns:CodeValue>
    </xsl:template>

    <xsl:template match="tns:EmailAddress">
        <tns:Description>
            <xsl:apply-templates />
        </tns:Description>
    </xsl:template>

</xsl:stylesheet>
于 2013-05-27T11:47:18.570 に答える