如何检查xsl模板中的两个或多个条件

时间:2011-05-31 05:37:38

标签: xslt xslt-1.0

如何检查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,普利文,pravz,USA

O102N,000002,praveen,pubbypravz,英国

1 个答案:

答案 0 :(得分:0)

为了帮助您通过示例学习,我稍微修改了您的转换:

<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