これは十分に単純に思えますが、機能させることができないようです。
私の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="'
'"/> <!-- 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="'
'"/> <!-- 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 回表示されています。私が間違っていることに気づいたら、私に知らせてください。
前もって感謝します。