我有一个要求,我必须增加计数并将该值分配给目标元素之一。
对于前 - 我的输入请求是这样的
<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>
有什么可以帮我解决我的问题吗?一段代码将对我有所帮助。
答案 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>
您当然也需要自己完成样式表的其余部分,但这涵盖了您在问题中概述的逻辑。