如何根据某些条件在XSLT 1.0中迭代计数器

时间:2016-06-25 14:14:18

标签: templates xslt xsd xslt-1.0

我有一个要求,我必须增加计数并将该值分配给目标元素之一。

对于前 - 我的输入请求是这样的

<Deliveries>
<Delivery>
<OrderNo>
1234
</OrderNo>
<orderItem>
12
</orderItem>
</Delivery>
<Delivery>
<OrderNo>
S1234
</OrderNo>
<orderItem>
12
</orderItem>
</Delivery>
</Deliveries>

Delivery是父元素,它是无限的,我的输出XSD只是表格列。

<Order_table>
<Orders>
<column1>
<column2>
</Orders>
</Order_table>

现在我的要求是如果OrderNo包含第一个字母为S,那么我必须为column1分配1个值,否则我只需要复制orderItem的值。每次我得到以S开头的OrderNo值然后我必须将值递增1但是如果orderNo不是以S开头那么它不应该增加1.由于这个逻辑,我无法使用位置函数作为好。

例如 -

如果我的输入是 -

<Deliveries>
    <Delivery>
    <OrderNo>
     S1234
    </OrderNo>
    <orderItem>
    12
    </orderItem>
    </Delivery>
    <Delivery>
    <OrderNo>
    1234
    </OrderNo>
    <orderItem>
    12
    </orderItem>
    </Delivery>
<Delivery>
    <OrderNo>
    S1234
    </OrderNo>
    <orderItem>
    12
    </orderItem>
    </Delivery>

    </Deliveries>

然后我的输出应该是 -

<Order_table>
    <Orders>
    <column1>1</column1> <-- First value as 1 as Order starts from S  
 <column2>
    </Orders>
 <Orders>
    <column1>12</column1> copy of orderItem bcz orderNo don't start with S
    <column2>
    </Orders>

 <Orders>
    <column1>2</column1> Increment from 1 to 2 as Order again starts from S
    <column2>
    </Orders>

    </Order_table>

有什么可以帮我解决我的问题吗?一段代码将对我有所帮助。

2 个答案:

答案 0 :(得分:1)

尝试:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
    <Order_table>
        <xsl:apply-templates select="//OrderNo"/>
    </Order_table>
</xsl:template>

<xsl:template match="OrderNo[starts-with(normalize-space(.), 'S')]">
    <Orders>
        <column1>
            <xsl:number level="any" count="OrderNo[starts-with(normalize-space(.), 'S')]"/>
        </column1>
        <column2/>
    </Orders>      
</xsl:template>

<xsl:template match="OrderNo">
    <Orders>
        <column1><xsl:value-of select="normalize-space(../orderItem)"/></column1>
        <column2/>
    </Orders>
</xsl:template>
</xsl:stylesheet>

答案 1 :(得分:0)

当您的上下文放置在Delivery节点时,测试starts-with(OrderNo,&#39; S&#39;),然后使用相同的测试向后计算兄弟姐妹的数量。这将为您提供增量值。

<xsl:template match="Delivery">
    <Orders>

        <column1>

            <xsl:choose>

                <xsl:when test="starts-with(OrderNo,'S')">
                    <xsl:value-of select="1+count(preceding-sibling::Delivery[starts-with(OrderNo,'S')])"/>
                </xsl:when>

                <xsl:otherwise>
                    <xsl:value-of select="orderItem"/>
                </xsl:otherwise>

            </xsl:choose>

        </column1>

        <column2/>
    </Orders>
</xsl:template>

您当然也需要自己完成样式表的其余部分,但这涵盖了您在问题中概述的逻辑。