-1
<pre><getPolicystatus>
<agentno>001</agentno>
<policynumber>1</policynumber><req><req1>age</req1><status>success</status></req><req><req1>test</req1><status>failure</status></req><req><req1>health</req1><status>success</status></req></policyresult>
<policyresult><agentno>001</agentno>
<policynumber>1</policynumber><req><req1>age</req1><status>success</status></req><req><req1>test</req1><status>failure</status></req><req><req1>health</req1><status>success</status></req></policyresult>
<policyresult><agentno>002</agentno>
<policynumber>1</policynumber><req><req1>age</req1><status>success</status></req><req><req1>test</req1><status>failure</status></req><req><req1>health</req1><status>success</status></req></policyresult></getPolicystatus>
</pre>

上記のようなXMLがあります。エージェント番号に基づいて、以下のような出力を表示する必要があります。エージェント番号が繰り返される場合は、その番号をスキップする必要があります。

001

1agesuccesstestfailurehealthsuccess
1agesuccesstestfailurehealthsuccess

002

1agesuccesstestfailurehealthsuccess
4

1 に答える 1

0

(a) サンプル XML の最初の行の末尾に policyresult の開始タグがないこと、および (b) XSLT 1.0 で、agentno を持つすべての policyresult 要素を処理することを意味すると仮定します。 child が直前の兄弟の agentno の子と異なる場合、最も簡単な方法は、policyresult の 2 つのテンプレートを作成することです。

要素を表示する必要があるケースを処理します。

<xsl:template match="policyresult">
  <!--* contents left as exercise for the reader ... *-->
</xsl:template>

もう 1 つは、要素を抑制する必要があるケースを処理します。

<xsl:template match="policyresult
  [agentno = ../preceding-sibling::policyresult[1]/agentno]"/>

一方、(b') policyresult の agentno が、直前の policyresult 要素のエージェント番号だけでなく、先行するエージェント番号と一致する[1]場合に policyresult を抑制する必要がある場合は、2 番目の一致パターンの を抑制します。

追記

これら 2 つのテンプレートは、作成する他のテンプレートと一緒に、作成する XSL スタイルシート内で一緒になるため、多かれ少なかれ次のようなものになります。

  <xsl:output method="text"/>

  <xsl:template match="policyresult">
    <xsl:text>&#xA;&#xA;</xsl:text>
    <xsl:value-of select="agentno"/>
    <xsl:text>&#xA;&#xA;&#xA;</xsl:text>
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="policyresult
  [agentno = preceding-sibling::policyresult[1]/agentno]">
    <xsl:message>Suppressing duplicate policyresult ...</xsl:message>
  </xsl:template>

  <xsl:template match="agentno"/>
  <xsl:template match="text()[not(normalize-space())]"/>

</xsl:stylesheet>

XSLT を使い始めたばかりの場合は、優れたチュートリアルの概要を入手して、それを実行することを強くお勧めします。XSLT は他のプログラミング言語とは大きく異なるため、単にブラフを行うだけでは満足のいく結果にはなりません。

于 2013-02-03T20:52:16.440 に答える