2

私はこのようなxmlを持っています:

  <ROWSET>
    <ROW>
      <FLD1>P2</FLD1>
      <S_VAL>1</S_VAL>    
      <FLD2>N2</FLD2>
    </ROW>
    <ROW>
      <FLD1>P3</FLD1>
      <S_VAL>2</S_VAL> 
      <FLD2>N2</FLD2>    
    </ROW>
     <ROW>
      <FLD1>P3</FLD1>
      <S_VAL>3</S_VAL> 
      <FLD2>N2</FLD2>    
    </ROW>
    <ROW>
      <FLD1>P4</FLD1>
      <S_VAL>4</S_VAL>    
       <FLD2>N3</FLD2>
    </ROW>
    <ROW>
      <FLD1>P2</FLD1>
      <S_VAL>5</S_VAL>    
      <FLD2>N3</FLD2>
    </ROW>
  </ROWSET>

そして、xslには2つの変数があります。

  <xsl:variable name="only_need" select="/ROWSET/ROW[./FLD2='N2']"/>
  <xsl:variable name="only_need2" select="$only_need/FLD1[not(.=following::FLD1)]"/>

「only_need」という名前の変数で、S_Val IN(1、2、3)のレコードを受け取ります。しかし、「only_need2」という名前の変数では、FLD1=P3のみを受け取ります。2番目の変数がFLD1=P3のみを受け取る理由の質問?

4

2 に答える 2

1

only_need2だけでなく、ドキュメント全体の後続のすべての要素の値とは異なる値をFLD1持つ行の子が含まれます。したがって、後で(5行目に)別のものがあるため、取得できません。only_needFLD1only_needP2P2

必要なのが実際には各個別の値の最後の行である場合は、キーを使用してそれを行うことができますonly_needFLD1

<xsl:key name="key_only_need2" match="/ROWSET/ROW[FLD2='N2']/FLD1" use="." />
<xsl:variable name="only_need2" select="$only_need/FLD1[
      generate-id() = generate-id( key('key_only_need2', .)[last()] )]" />

ここで行っているのは、行からすべての要素を抽出し、それらを値でグループ化するキーを定義するFLD1ことです。変数宣言の述語は、このキーを使用して、これらの各グループから最後の要素のみを選択します。FLD2N2FLD1

于 2012-09-28T09:01:29.660 に答える
0

これは、コメントからIanRobertsによる良い答えへの質問に答えます。

「only_need」にのみ「following」を使用するにはどうすればよいですか。

実際、これは純粋なXPathの質問です。

キーの使用を避け、「前」や「後」などの軸を使用して「個別の」要素を見つけることは可能ですが、これは非常に遅いことに注意してください--O(N ^ 2)キー-(O(N)):

 <xsl:variable name="vOnlyNeed" select="/*/*[FLD2='N2']"/>
 <xsl:variable name="vOnlyNeedDistinct" select=
  "$vOnlyNeed
   [not(FLD1
       =
        following::*
           [count(.|$vOnlyNeed) = count($vOnlyNeed)]
             /FLD1)]
   "/>

これが完全な変換です:

<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:variable name="vOnlyNeed" select="/*/*[FLD2='N2']"/>
 <xsl:variable name="vOnlyNeedDistinct" select=
  "$vOnlyNeed
   [not(FLD1
       =
        following::*
           [count(.|$vOnlyNeed) = count($vOnlyNeed)]
             /FLD1)]
   "/>

 <xsl:template match="/">
     <xsl:copy-of select="$vOnlyNeedDistinct"/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合

<ROWSET>
    <ROW>
        <FLD1>P2</FLD1>
        <S_VAL>1</S_VAL>
        <FLD2>N2</FLD2>
    </ROW>
    <ROW>
        <FLD1>P3</FLD1>
        <S_VAL>2</S_VAL>
        <FLD2>N2</FLD2>
    </ROW>
    <ROW>
        <FLD1>P3</FLD1>
        <S_VAL>3</S_VAL>
        <FLD2>N2</FLD2>
    </ROW>
    <ROW>
        <FLD1>P4</FLD1>
        <S_VAL>4</S_VAL>
        <FLD2>N3</FLD2>
    </ROW>
    <ROW>
        <FLD1>P2</FLD1>
        <S_VAL>5</S_VAL>
        <FLD2>N3</FLD2>
    </ROW>
</ROWSET>

Xpath式が評価され、そのように定義された変数の内容が$vOnlyNeedDistinct出力にコピーされます

<ROW>
   <FLD1>P2</FLD1>
   <S_VAL>1</S_VAL>
   <FLD2>N2</FLD2>
</ROW>
<ROW>
   <FLD1>P3</FLD1>
   <S_VAL>3</S_VAL>
   <FLD2>N2</FLD2>
</ROW>
于 2012-09-28T12:48:45.917 に答える