我收到了以下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。但是有没有办法在程序语言中打破。我可以以某种方式比较每个值并返回一个布尔值,表示所有值都相同或不同。??
谢谢大家的回复。
答案 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 。