2

これは十分に単純に思えますが、機能させることができないようです。

私のxmlは次のようになります:

<bsar:BSAForm>
    <bsar:SubjectInformation>
        <bsar:LastNameOrNameOfEntity> Obama</bsar:LastNameOrNameOfEntity>
        <bsar:AddressBlock>
            <ucc:Address> 9 Dale Rd</ucc:Address>
            <ucc:City> Woodbury</ucc:City>
        </bsar:AddressBlock>
        <bsar:AddressBlock>
            <ucc:Address> 123 Fake St</ucc:Address>
            <ucc:City> Springfield</ucc:City>
        </bsar:AddressBlock>
    </bsar:SubjectInformation>
</bsar:BSAForm>

これらの要素の両方を繰り返し処理し、コンテンツを表示する必要があります。私の XSLT は次のようになります。

<xsl:template match=/bsar:BSAForm">
     <xsl:apply-templates select="bsar:SubjectInformation"/>
</xsl:template>

<xsl:template match="bsar:SubjectInformation">
    <xsl:text xml:space="preserve">4A</xsl:text>
    <xsl:text xml:space="preserve">00001</xsl:text>
    <xsl:value-of select="bsar:LastNameOrNameOfEntity"/>
    <xsl:value-of select="'&#xD;&#xA;'"/> <!-- new line -->

    <xsl:apply-templates select="bsar:AddressBlock"/>
</xsl:template>

<xsl:template match="bsar:AddressBlock">

    <xsl:variable name="Addr" select="../bsar:AddressBlock"/>

    <xsl:text xml:space="preserve">4B</xsl:text>
    <xsl:text xml:space="preserve">00001</xsl:text>
    <xsl:value-of select="$Addr/ucc:Address"/>
    <xsl:value-of select="$Addr/ucc:City"/>
    <xsl:value-of select="'&#xD;&#xA;'"/> <!-- new line -->
</xsl:template>

出力は次のようになります。

4A 00001 Obama
4B 9 Dale Rd Woodbury
4B 123 Fake St Springfield

しかし、代わりに、出力は次のようになります。

4A 00001 Obama
4B 9 Dale Rd Woodbury
4B 9 Dale Rd Woodbury

これを行うには、 for each を使用して、次のように for each を使用して、さまざまな方法を試しました。

 <xsl:variable name="header" select="."/>
 <xsl:for-each select="following-sibling::bsar:TelephoneBlock[ancestor::bsar:SubjectInformation[1] = $header]">

または、for ループからカウンターを渡し、それを使用して、次のように指定された要素にアクセスすることもできます。

<xsl:for-each select="bsar:TelephoneBlock">
    <xsl:variable name="Index">
        <xsl:number count="bsar:TelephoneBlock" />
    </xsl:variable>

    <xsl:call-template name="SubjectPhone">
        <xsl:with-param name="$Index"/>
    </xsl:call-template>
</xsl:for-each>

<xsl:template name="SubjectPhone">
    <xsl:param name="Index"/>

    <xsl:variable name="Telephone" select="../bsar:TelephoneBlock[$Index]"/>
    ...
</xsl:template>

これらすべてのケースで、最初のアドレスが 2 回表示されています。私が間違っていることに気づいたら、私に知らせてください。

前もって感謝します。

4

1 に答える 1

3
<xsl:variable name="Addr" select="../bsar:AddressBlock"/>

bsar:AddressBlockテンプレート内では、現在の要素の親の下にあるすべての要素、つまり現在の AddressBlock とそのすべての兄弟 AddressBlock 要素もAddr含むノード セットに変数が設定されます。あとで来るときはbsar:AddressBlock

<xsl:value-of select="$Addr/ucc:Address"/>

ucc:Addressこれにより、 内のすべての AddressBlock 要素のすべての子要素を含むノード セットが選択され、ドキュメント順で最初の$Addrそのような要素が文字列値に変換されます (XPath 1.0 でのノード セットの「文字列値」の定義は文字列値です)。最初のノードの)。これは常に最初の AddressBlock にあるため、同じアドレスが 2 回表示されます。ucc:Address

ただし、一度に 1 つの AddressBlock に適用されるテンプレートを使用しているため、変数は不要です。

<xsl:template match="bsar:AddressBlock">
    <xsl:text>4B</xsl:text>
    <xsl:text>00001</xsl:text>
    <xsl:value-of select="ucc:Address"/>
    <xsl:value-of select="ucc:City"/>
    <xsl:value-of select="'&#xD;&#xA;'"/> <!-- new line -->
</xsl:template>

式はselect現在の AddressBlock に相対的であり、その Address と City を具体的に抽出し、

4A00001 Obama
4B00001 9 Dale Rd Woodbury
4B00001 123 Fake St Springfield

これは、元の XML の各 Address 値と City 値の先頭にスペースがあるという事実に依存しています。

<xsl:template match="bsar:AddressBlock">
    <xsl:text>4B </xsl:text>
    <xsl:text>00001 </xsl:text>
    <xsl:value-of select="normalize-space(ucc:Address)"/>
    <xsl:text> </xsl:text>
    <xsl:value-of select="normalize-space(ucc:City)"/>
    <xsl:value-of select="'&#xD;&#xA;'"/> <!-- new line -->
</xsl:template>

xml:space="preserve"はデフォルト<xsl:text>なので、明示的に指定する必要はありません)

于 2013-02-22T15:37:50.403 に答える