2

我有以下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>

我需要做的是查看某些节点中的值,确定它们是否不同,如果不同,则编写一些不同的 html 代码,每个部分之间有一个分页符。

所以,我需要比较这些<Element1>值,看看它们是否不同。这些<Element1>值可以是任何文本,并且<Element1>xml 中的标签数量可以是无限的。

所以在这种情况下,我们有两个不同<Element1>的值:“ZZZ”和“XXX”。

因此,如果有两个“”,则如下所示:

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

但是使用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>

如果存在三个不同的</Element1>值。

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

4

1 回答 1

1

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

count(//Element1[not(. = preceding::Element1)])

您可以在其属性中定义一个指定上述值的select变量,然后在test条件指令的属性中使用此变量。

更好的是,根本不使用条件指令并将上述 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 文档时:

<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>

产生了想要的正确结果

 Two processing

当对以下 XML 文档应用相同的转换时

<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

注意

当然,您需要将模板的主体替换为您想要的处理。

于 2012-06-07T13:19:44.347 回答