2012-12-03 19 views
0

我得到了以下的XML片段。XSLT:如何识别值相同的列表?

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

谢谢大家的回复。

回答

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

+0

嗨德米特雷,感谢您的帮助。但是你的解决方案不起作用。我有多组值。不只是2.它可以是任何值的。 1)如果所有的值1具有相同的值,并且所有的值2具有相同的值,则整个值集合应被压缩为一个值。 2)dateFrom也应该从第一个Values项中取出,而dateTo应该取自最后一个Values项。问候 – user1872757

+0

@ user1872757,请编辑*您的问题,并提供更具代表性的XML文档和更精确的说明需要完成的事情。请提供该XML文档的确切结果。 –