我们怎样才能实现XSLT条件增量(How can we achieve Conditional in

2019-10-17 19:46发布

输入:

<Order>
  <HeaderValue1>ORDER1</HeaderValue1>
  <OrderLineItems>
    <Item>`A`</Item>
  </OrderLineitems>
  <OrderLineItems>
    <Item>A</Item>
  </OrderLineItems>
  <OrderLineItems>
    <Item>`A`</Item>`
  </OrderLineItems>
  <OrderLineItems>`
    <Item>B</Item>`
  </OrderLineItems>
</Order>
<Order>
  <HeaderValue1>`ORDER2`</HeaderValue1>
  <OrderLineItems>
    <Item>B`</Item>
  </OrderLineItems>
</Order>

每个订单有许多orderLineItems都present.For每次我们需要分配一个增量值。如果前一个项目价值秩序和物品等于当前项目value.there是没有必要增加只是通过value.otherwise增量值是分配给项元素。 我需要的输出类似下面。

<Order>
  <HeaderValue1>1`</HeaderValue1>
  <OrderLineItems>`
    <Item>2`</Item>
  </OrderLineItems>
  <OrderLineItems>
    <Item>A`</Item>
  </OrderLineItems>
  <OrderLineItems>
    <Item>A`</Item>
  </OrderLineItems>
  <OrderLineItems>
    <Item>3`</Item>
  </OrderLineItems>
</Order>
<Order>
  <HeaderValue1>4</HeaderValue1>
  <OrderLineItems>
    <Item>5</Item>
  </OrderLineItems>
</Order>

Answer 1:

这一转变

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:param name="pNum" select="0"/>
  <xsl:copy>
   <xsl:apply-templates select="node()[1]|@*">
     <xsl:with-param name="pNum" select="$pNum"/>
   </xsl:apply-templates>
  </xsl:copy>
  <xsl:apply-templates select="following-sibling::node()[1]">
   <xsl:with-param name="pNum" select="$pNum"/>
  </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="HeaderValue1">
  <xsl:param name="pNum" select="0"/>

        <HeaderValue1><xsl:value-of select="$pNum+1"/></HeaderValue1>

      <xsl:apply-templates select="following-sibling::node()[1]">
       <xsl:with-param name="pNum" select="$pNum+1"/>
    </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="OrderLineItems[not(. = preceding-sibling::*[1])]">
  <xsl:param name="pNum" select="0"/>

        <OrderLineItems>
       <xsl:apply-templates select="node()[1]|@*">
         <xsl:with-param name="pNum" select="$pNum+1"/>
       </xsl:apply-templates>
        </OrderLineItems>
      <xsl:apply-templates select="following-sibling::node()[1]">
       <xsl:with-param name="pNum" select="$pNum+1"/>
      </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="Item[not(. = ../preceding-sibling::*[1])]">
  <xsl:param name="pNum" select="0"/>

  <Item><xsl:value-of select="$pNum"/></Item>
 </xsl:template>

 <xsl:template match="Order">
  <xsl:param name="pNum" select="0"/>

  <Order>
   <xsl:apply-templates select="node()[1]|@*">
     <xsl:with-param name="pNum" select="$pNum"/>
   </xsl:apply-templates>
     <xsl:apply-templates select="following-sibling::node()[1]">
       <xsl:with-param name="pNum" select=
       "$pNum +1 + count(OrderLineItems[not(. = preceding-sibling::*[1])])"/>
   </xsl:apply-templates>
  </Order>

 </xsl:template>
</xsl:stylesheet>

当所提供的XML文档应用(校正为良好的形成):

<t>
    <Order>
        <HeaderValue1>ORDER1</HeaderValue1>
        <OrderLineItems>
            <Item>A</Item>
        </OrderLineItems>
        <OrderLineItems>
            <Item>A</Item>
        </OrderLineItems>
        <OrderLineItems>
            <Item>A</Item>
        </OrderLineItems>
        <OrderLineItems>
            <Item>B</Item>
        </OrderLineItems>
    </Order>
    <Order>
        <HeaderValue1>ORDER2</HeaderValue1>
        <OrderLineItems>
            <Item>B</Item>
        </OrderLineItems>
    </Order>
</t>

产生想要的,正确的结果:

<t>
   <Order>
      <HeaderValue1>1</HeaderValue1>
      <OrderLineItems>
         <Item>2</Item>
      </OrderLineItems>
      <OrderLineItems>
         <Item>A</Item>
      </OrderLineItems>
      <OrderLineItems>
         <Item>A</Item>
      </OrderLineItems>
      <OrderLineItems>
         <Item>3</Item>
      </OrderLineItems>
      <Order>
         <HeaderValue1>4</HeaderValue1>
         <OrderLineItems>
            <Item>5</Item>
         </OrderLineItems>
      </Order>
   </Order>
</t>


文章来源: How can we achieve Conditional increment in XSLT
标签: xslt