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>。それらが同じ場合、次のように全体を圧縮します。

値1 == すべての値が同じで、値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。しかし、手続き型言語のように破る方法はありますか。どういうわけか各値を比較して、すべての値が同じかどうかを示すブール値を返すことはできますか??

ご回答ありがとうございます。

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の最も基本的なデザインパターンを適用するだけです。IDルールの使用とオーバーライド。

于 2012-12-03T14:05:54.967 に答える