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 == 所有值相同,如果 values2== 所有值相同,那么这应该是输出。

<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) 中实现这一点?我知道迭代。为每个。但是有没有办法像程序语言一样打破。我可以以某种方式比较每个值并返回一个布尔值,说明所有值是否相同.. ??

谢谢大家的回复。

4

1 回答 1

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 最基本的设计模式:使用和覆盖标识规则

于 2012-12-03T14:05:54.967 回答