XSLT:如何识别值列表相同?

时间:2012-12-03 13:52:52

标签: iteration xslt-1.0

我收到了以下xml代码段。

<Root>
    <SomeTags></SomeTags>
    <Values>
        <dateFrom>date 1<dateFrom>
        <dateEnd>date 2<dateEnd>
        <value1>10</value1>
        <value2>5</value2>
    </Values>
   More Values here....
    .....................
    .....................
    <Values>
        <dateFrom>date n<dateFrom>
        <dateEnd>date  n+1<dateEnd>
        <value1>10</value1>
        <value2>5</value2>
    </Values>
</Root>

我想比较所有<value1>值和<value2>值。如果它们相同,我想压缩整体如下:

如果所有值中的values1 ==相同,并且如果所有值中的值2 = =相同,那么这应该是输出。

<Values>
    <dateFrom>date 1<dateFrom> should be from the first Values item
    <dateEnd>date  n+1<dateEnd> should be from the last Values item
    <value1>10</value1>
    <value2>5</value2>
</Values>

否则     不同的模板。

如何在BizTalk 2009中的XSLT(1.0)中实现这一目标? 我知道迭代。的for-each。但是有没有办法在程序语言中打破。我可以以某种方式比较每个值并返回一个布尔值,表示所有值都相同或不同。??

谢谢大家的回复。

1 个答案:

答案 0 :(得分:0)

此转化

<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:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="Values">
  <xsl:if test=
  "not(preceding-sibling::Values
              [value1=current()/value1 and value2=current()/value2])">
   <Values>
     <xsl:apply-templates select="value1|value2"/>
   </Values>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

应用于以下格式良好的XML文档(根据问题中提供的严重格式错误的文本生成):

<t>
    <Values>
        <dateFrom>date 1</dateFrom>
        <dateEnd>date 2</dateEnd>
        <value1>10</value1>
        <value2>5</value2>
    </Values>
    <somethingElse/>
    <Values>
        <dateFrom>date n</dateFrom>
        <dateEnd>date  n+1</dateEnd>
        <value1>10</value1>
        <value2>5</value2>
    </Values>
</t>

产生想要的结果

<t>
   <Values>
      <value1>10</value1>
      <value2>5</value2>
   </Values>
   <somethingElse/>
</t>

<强>解释

只应用XSLT最基本的设计模式:使用和覆盖 identity rule