0

これが問題です。変換された XSLT は、2 つの電話番号 <Phone_1> と <Phone_2> をそれぞれ 1 つずつ表示するはずです。Fax タグは参照用に追加しただけです。

これは、変換する必要がある XML のスニペットです。

    <DirPartyContactInfoView>
        <Locator>08-922100</Locator>
        <Type>Phone</Type>
    </DirPartyContactInfoView>
        <Locator>073-6564865</Locator>
        <Type>Phone</Type>
    </DirPartyContactInfoView>    
        <Locator>08-922150</Locator>
        <Type>Fax</Type>
    </DirPartyContactInfoView>

これが、このスニペットの XSLT に対する現在の見解です。これまでのところ、変数を条件として設定しようとしましたが、変数値を一度しか設定できず、変更できないことを知っていました。

<xsl:for-each select="DirPartyContactInfoView">
    <xsl:choose>
        <xsl:when test="Type='Phone'">
            <xsl:variable name="Phone1" />
            <xsl:choose>                                        
                <xsl:when test="Phone1=''">     
                    <xsl:variable name="Phone1" select="Locator" />                                 
                    <Phone_1>
                        <xsl:value-of select="Locator" />
                    </Phone_1>
                </xsl:when>
                <xsl:otherwise>
                    <Phone_2>
                        <xsl:value-of select="Locator" />
                    </Phone_2>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:when>
        <xsl:when test="Type='Fax'">
            <Fax>
                <xsl:value-of select="Locator" />
            </Fax>
        </xsl:when>
    </xsl:choose>
</xsl:for-each>

それでも、出力に 2 つの <Phone_2> が表示され、まったくアイデアがありません。このような変数は使用できないと思います。これを修正する方法はありますか?

4

3 に答える 3

1

本当にxsl:for-eachループが必要ですか?<Locator>XPath を使用して要素に直接アクセスすることもできます。

 //DirPartyContactInfoView[1]/Locator
 //DirPartyContactInfoView[2]/Locator

それでもループが必要な場合はxsl:for-each、次のようなものが役立つかもしれません。

<xsl:for-each select="DirPartyContactInfoView">
    <xsl:choose>
        <xsl:when test="Type='Phone'">
            <xsl:choose>                                        
                <xsl:when test="position()='1'">     
                    <Phone_1>
                        <xsl:value-of select="Locator" />
                    </Phone_1>
                </xsl:when>
                <xsl:otherwise>
                    <Phone_2>
                        <xsl:value-of select="Locator" />
                    </Phone_2>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:when>
    </xsl:choose>
</xsl:for-each>
于 2013-09-19T09:32:47.477 に答える
0

@flaskisは質問を変更することで以前の回答に答えたので、私は少し参考になりませんが、ここでの適切な解決策は次の形式である可能性があります

<xsl:template match="phone[1]">...</xsl:template>
<xsl:template match="phone[2]">...</xsl:template>

ここでは、1 番目と 2 番目の phone 要素に異なるテンプレート ルールが適用されます。

于 2013-09-19T11:36:52.293 に答える