使用XSLT foreach循环比较xml中的值并确定它们是否相同

使用XSLT foreach循环比较xml中的值并确定它们是否相同,xslt,foreach,compare,Xslt,Foreach,Compare,我有以下xml: <?xml version="1.0" encoding="UTF-8"?> <abc1 formName="Form"> <Level1> <Element1>ZZZ</Element1> <Element2> <SubElement1>Apples</SubElement1> <SubE

我有以下xml:

<?xml version="1.0" encoding="UTF-8"?>
<abc1 formName="Form">
    <Level1>
        <Element1>ZZZ</Element1>
        <Element2>
            <SubElement1>Apples</SubElement1>
            <SubElement2>Oranges</SubElement2>
            <SubElement3>Pears</SubElement3>
            <SubElement4>Blueberries</SubElement4>
            <SubElement5>Milkshakes</SubElement5>
        </Element2>
    </Level1>
    <Level1>
        <Element1>XXX</Element1>
        <Element2>
            <SubElement1>Apples</SubElement1>
            <SubElement2>Oranges</SubElement2>
            <SubElement3>Kiwifruit</SubElement3>
            <SubElement4>Blueberries</SubElement4>
            <SubElement5>Soda</SubElement5>
        </Element2>
    </Level1>
</abc1>

ZZZ
苹果
橘子
梨
蓝莓
奶昔
XXX
苹果
橘子
猕猴桃
蓝莓
苏打水
我需要做的是查看一些节点中的值,确定它们是否不同,如果不同,那么在每个部分之间编写一些不同的html代码,并在每个部分之间使用分页符

因此,我需要比较
值,看看它们是否不同。
值可以是任何文本,
标记的数量在xml中可以是无限的

因此,在本例中,我们有两个不同的
值:“ZZZ”和“XXX”

如果有两个“”,则类似于以下内容:


但是使用for循环来搜索xml,以及类似的东西

<xsl:choose>
<xsl:when test="differentvalues = 'true'">
<!--  SomeHTMLCode!-->
<p style="page-break-after: always"/>
<!--  SomeHTMLCode!-->
<p style="page-break-after: always"/>
<!--  SomeHTMLCode!-->
</xsl:when>
<xsl:otherwise><!--  SomeHTMLCode!--></xsl:otherwise>
</xsl:choose>

如果有三个不同的

我甚至不确定这是否能做到。
提前感谢您为我提供的任何帮助。

此XPath表达式提供了
Element1
的不同值的所需计数(假设
Element1
也不能有后代
Element1
(有更有效的方法用钥匙来处理此类问题,但我不会对新手谈论钥匙):

您可以在其
选择
属性中定义一个指定上述值的变量,然后在条件指令的
测试
属性`中使用该变量

更好的是,根本不使用条件指令,而是将上述XPath表达式指定为模板匹配模式的一部分:

<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="/*[count(//Element1[not(. = preceding::Element1)]) = 2]">
     Two processing
 </xsl:template>

 <xsl:template match="/*[count(//Element1[not(. = preceding::Element1)]) = 3]">
     Three processing
 </xsl:template>
</xsl:stylesheet>
当对以下XML文档应用相同的转换时

 Two processing
<abc1 formName="Form">
    <Level1>
        <Element1>ZZZ</Element1>
        <Element2>
            <SubElement1>Apples</SubElement1>
            <SubElement2>Oranges</SubElement2>
            <SubElement3>Pears</SubElement3>
            <SubElement4>Blueberries</SubElement4>
            <SubElement5>Milkshakes</SubElement5>
        </Element2>
    </Level1>
    <Level1>
        <Element1>YYY</Element1>
        <Element2>
            <SubElement1>Apples</SubElement1>
            <SubElement2>Oranges</SubElement2>
            <SubElement3>Pears</SubElement3>
            <SubElement4>Blueberries</SubElement4>
            <SubElement5>Milkshakes</SubElement5>
        </Element2>
    </Level1>
    <Level1>
        <Element1>XXX</Element1>
        <Element2>
            <SubElement1>Apples</SubElement1>
            <SubElement2>Oranges</SubElement2>
            <SubElement3>Kiwifruit</SubElement3>
            <SubElement4>Blueberries</SubElement4>
            <SubElement5>Soda</SubElement5>
        </Element2>
    </Level1>
</abc1>
 Three processing
注意

 Two processing
<abc1 formName="Form">
    <Level1>
        <Element1>ZZZ</Element1>
        <Element2>
            <SubElement1>Apples</SubElement1>
            <SubElement2>Oranges</SubElement2>
            <SubElement3>Pears</SubElement3>
            <SubElement4>Blueberries</SubElement4>
            <SubElement5>Milkshakes</SubElement5>
        </Element2>
    </Level1>
    <Level1>
        <Element1>YYY</Element1>
        <Element2>
            <SubElement1>Apples</SubElement1>
            <SubElement2>Oranges</SubElement2>
            <SubElement3>Pears</SubElement3>
            <SubElement4>Blueberries</SubElement4>
            <SubElement5>Milkshakes</SubElement5>
        </Element2>
    </Level1>
    <Level1>
        <Element1>XXX</Element1>
        <Element2>
            <SubElement1>Apples</SubElement1>
            <SubElement2>Oranges</SubElement2>
            <SubElement3>Kiwifruit</SubElement3>
            <SubElement4>Blueberries</SubElement4>
            <SubElement5>Soda</SubElement5>
        </Element2>
    </Level1>
</abc1>
 Three processing

当然,您需要用所需的处理来替换模板的主体。

这不是同样的问题吗?我想这是类似的,但我使用xslt的时间不长,并且认为它们有点不同。谢谢。这太棒了。我以前从未见过。如果“级别”的数量未知呢?我想那么你能做些什么呢?你将代码设置为二级和三级……但是如果它未知怎么办?@CooperCripps:这个解决方案适用于任意数量的s级和任意嵌套的s级。你能接受这个答案吗(通过单击旁边的复选标记?嗨,Dimitre,但您列出了两个模板:一个用于“两个处理”,另一个用于“三个处理”。假设我不知道是否有“五个处理”或“十个处理”。如果您只有两个模板,我不明白它如何适用于任何级别。抱歉,这有点像外行。)估计。@CooperCripps:我只是根据您的问题的文本进行指导。如果可能的计数是静态未知的,那么您将在一个模板中有一个
,对于您要以特定方式处理的计数,每个间隔的值都有多个's'。