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」の2つの異なる値があります。

したがって、''が2つある場合は、次のようになります。

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

3つの異なる</Element1>値がある場合。

これができるかどうかさえわかりません。あなたが私に提供することができるどんな助けにも前もって感謝します。

4

1 に答える 1

1

この XPath 式は、必要な個別の値の数を示します( が子孫を持つこともできないElement1と仮定します (Element1Element1キーを使用してこのような問題を処理するより効率的な方法がありますが、キーについては初心者には説明しません)。

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 に答える