0

私は以下の問題に苦しんでいます。あなたの誰かがこれを解決するために私を提案または導くことを願っています。

以下の疑似xsdタイプのペイロードがあります。

<element name=Main maxCoccurs=unbounded>
        <complexType>
            <element name=input1/>
            <element name=input2/>
            <element name=input3/>
            <element name=input4/>
            <element name=input5/>
            <element name=inside/>
                <element name=username/>
                <element name=address/>
        </complextype>
    <element>

メインは繰り返し可能な要素です。ユーザー名を確認したいのですが、すべてのノードのユーザー名の値が等しくない場合は、最初のノードのユーザー名に空白の値を割り当てる必要があります。

どうすればこれを変革で行うことができますか?

私はこれを以下のように試しています:変数で最初のユーザー名を取得し、for-eachを使用してすべてのユーザー名でそれを確認します。等しくない場合....しかし、私はn番目のノードのユーザー名のどこかにいるので、最初のノードに空白の値を割り当てることはできません。

unmatched = true()と言うために変数を使用することを考えていましたが、xsltでは、宣言された変数に変更を加えることはできません。したがって、そのオプションでさえ除外されます。

どうすればこれを達成できますか?これを解決するのを手伝ってください。

私がはっきりしていることを願っています。

乾杯チャンドル

4

1 に答える 1

0

使用できる要素fooの親要素の名前であると仮定しますmain

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0">

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* , node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="foo[some $m in main satisfies $m/username != main/username]/main[1]/username">
  <xsl:copy/>
</xsl:template>

</xsl:stylesheet>

入力サンプルは次のとおりです。

<root>
  <foo>
     <main>
       <input1/>
       <input2/>
       <input3/>
       <input4/>
       <input5/>
       <inside/>
       <username>u1</username>
       <address/>
     </main>
     <main>
       <input1/>
       <input2/>
       <input3/>
       <input4/>
       <input5/>
       <inside/>
       <username>u1</username>
       <address/>
     </main>
     <main>
       <input1/>
       <input2/>
       <input3/>
       <input4/>
       <input5/>
       <inside/>
       <username>u2</username>
       <address/>
     </main>
     <main>
       <input1/>
       <input2/>
       <input3/>
       <input4/>
       <input5/>
       <inside/>
       <username>u1</username>
       <address/>
     </main>
  </foo>
</root>

スタイルシートをSaxon9.4で適用すると、次のように出力されます。

<root>
  <foo>
     <main>
       <input1/>
       <input2/>
       <input3/>
       <input4/>
       <input5/>
       <inside/>
       <username/>
       <address/>
     </main>
     <main>
       <input1/>
       <input2/>
       <input3/>
       <input4/>
       <input5/>
       <inside/>
       <username>u1</username>
       <address/>
     </main>
     <main>
       <input1/>
       <input2/>
       <input3/>
       <input4/>
       <input5/>
       <inside/>
       <username>u2</username>
       <address/>
     </main>
     <main>
       <input1/>
       <input2/>
       <input3/>
       <input4/>
       <input5/>
       <inside/>
       <username>u1</username>
       <address/>
     </main>
  </foo>
</root>

ここで、他のものとは異なるaを持つものがあるためusername、最初のmainは空になります。mainusername

[編集]答えが受け入れられたので少し混乱していますが、コメントにはXSLT1.0ソリューションが必要だと書かれています。以下にXSLT1.0スタイルシートを提供します。

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="foo[main[username != ../main/username]]/main[1]/username">
  <xsl:copy/>
</xsl:template>

</xsl:stylesheet>
于 2013-02-14T11:11:27.723 に答える