как проверить два или более условия в шаблоне xsl - PullRequest
1 голос
/ 31 мая 2011

как проверить два или более условий в xslt

вот мой xml

 <swift>
 <message>
 <block2 type="input">
    <messageType>102</messageType>
    <receiverAddress>BKTRUS33XBRD</receiverAddress>
    <messagePriority>N</messagePriority>     
 </block2>
 <block3>
 <tag>
 <name>32</name>
 <value>praveen</value>
 </tag>
 <tag>
 <name>42</name>
 <value>pubby</value>
 </tag>
 </block3> 
 <block4>
 <tag>
 <name>77</name>
 <value>pravz</value>
 </tag>
 <tag>
 <name>77</name>
 <value>pubbypravz</value>
 </tag>
 <tag>
 <name>99</name>
 <value>USA</value>
 </tag>
 <tag>
 <name>99</name>
 <value>UK</value>
 </tag>
 <tag>
 <name>76</name>
 <value>shanmu</value>
 </tag>
</block4>
 </message>
 </swift>

для этого выше xml мы применяем этот ниже шаблон xsl здесь, если любой из повторений теговВозникновение xslt работало, если предположить, что повторение произошло в xml другого тега. Это означает, как можно применить логику в xslt

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
 >
<xsl:output method="text" indent="no" />
<xsl:template match="/">
    <xsl:apply-templates select="/swift/message/block4/tag [name='77']"/>
</xsl:template>
<xsl:template match="/">
    <xsl:apply-templates select="/swift/message/block4/tag [name='99']"/>
</xsl:template>

<xsl:template match="message/block4/tag [name='77']">
    <xsl:apply-templates select="../../block2/@type"/>
    <xsl:value-of select="../../block2/messageType"/>
    <xsl:value-of select="../../block2/messagePriority"/>,<xsl:text/>
    <xsl:number format="000001"/>,<xsl:text/>
    <xsl:value-of select="../../block3/tag [name='32']/value"/>,<xsl:text/>
    <xsl:value-of select="value"/>

</xsl:template>

<xsl:template match="message/block4/tag [name='99']">


    <xsl:value-of select="value"/>
    <xsl:text>
    /xsl:text>
</xsl:template>

<xsl:template match="@type[.='input']">O</xsl:template>

<xsl:template match="@type[.='output']">I</xsl:template>

<xsl:template match="text()"/>

  </xsl:stylesheet>

Ожидаемый результат

O102N, 000001, правин, правз, США

O102N, 000002, правин, паббиправз, Великобритания

1 Ответ

0 голосов
/ 31 мая 2011

Чтобы помочь вам учиться на примере, я немного изменил ваше преобразование:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" >
    <xsl:output method="text" indent="no" />
    <xsl:template match="/">
        <xsl:apply-templates select="/swift/message/block4/tag [name='77']"/>
    </xsl:template>
    <xsl:template match="message/block4/tag [name='77']">
        <xsl:variable name="position" select="position()"/>
        <xsl:apply-templates select="../../block2/@type"/>
        <xsl:value-of select="../../block2/messageType"/>
        <xsl:value-of select="../../block2/messagePriority"/>,<xsl:text/>
        <xsl:number format="000001"/>,<xsl:text/>
        <xsl:value-of select="../../block3/tag [name='32']/value"/>,<xsl:text/>
        <xsl:value-of select="value"/>,<xsl:text/>
        <xsl:apply-templates select="/swift/message/block4/tag [name='99'][position()=$position]"/>
    </xsl:template>
    <xsl:template match="message/block4/tag [name='99']">
        <xsl:value-of select="value"/>
        <xsl:text>
</xsl:text>
    </xsl:template>
    <xsl:template match="@type[.='input']">O</xsl:template>
    <xsl:template match="@type[.='output']">I</xsl:template>
    <xsl:template match="text()"/>
</xsl:stylesheet>

Применительно к этому документу:

 <swift>
    <message>
        <block2 type="input">
            <messageType>102</messageType>
            <receiverAddress>BKTRUS33XBRD</receiverAddress>
            <messagePriority>N</messagePriority>
        </block2>
        <block3>
            <tag>
                <name>32</name>
                <value>praveen</value>
            </tag>
            <tag>
                <name>42</name>
                <value>pubby</value>
            </tag>
        </block3>
        <block4>
            <tag>
                <name>77</name>
                <value>pravz</value>
            </tag>
            <tag>
                <name>77</name>
                <value>pubbypravz</value>
            </tag>
            <tag>
                <name>99</name>
                <value>USA</value>
            </tag>
            <tag>
                <name>99</name>
                <value>UK</value>
            </tag>
            <tag>
                <name>76</name>
                <value>shanmu</value>
            </tag>
        </block4>
    </message>
</swift>

Это дает следующий результат:

O102N,000001,praveen,pravz,USA
O102N,000002,praveen,pubbypravz,UK
...