1

次のxmlが与えられた場合

   <Root>
 <Employee>
   <service>
     <Record>xxx</Record>
     <Record>yyy</Record>
   </service>
   <service>
    <Record>xxx</Record>
    <Record>yyy</Record>
    <Record>zzz</Record>
   </service>
</Employee>
<Employee>
  <service>
     <Record>xxx</Record>
     <Record>yyy</Record>
   </service>
   <service>
    <Record>xxx</Record>
    <Record>yyy</Record>
    <Record>zzz</Record>
   </service>
</Employee>
</Root>

XSLT1.0 を使用して、「xxx」、「yyy」、「zzz」を含む各フィールドの xml を変換する際<Employee><Record>、結果に 1 回だけ出現する必要があります。

<Root>
 <Employee>
    <Service>
     <Record>xxx</Record>
     <Record>yyy</Record>
     <Record>zzz</Record>
   </Service>
</Employee>
<Employee> 
  <Service>
  <Record>xxx</Record>
  <Record>yyy</Record>
  <Record>zzz</Record>
 <Service>
</Employee>
</Root>

Employee の for-each ループで、 の使用に疲れ<xsl:if test='not(preceding::./service/Record=$record)'>ました。テストは、'xxx','yyy','zzz' を 1 回だけ実行する最初のテストで正常に機能し<Employee>ます<Record>。反復が次に進むと<Employee>、テスト条件<Record>は最初の値<Employee>もチェックし、値「xxx」、「yyy」、「zzz」を持つ先行ノードがすでに存在することを検出するため、レコードを取得できません2番目<Employee><Record>2 番目の sを取得する方法<Employee>。どんな助けでも大歓迎です。

ありがとう

4

1 に答える 1

0

この変換では、Muenchianメソッドを使用してグループ化します

<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:key name="kEmpRecordByVal" match="Employee/service/Record"
  use="concat(generate-id(../..), '+', .)"/>

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

 <xsl:template match="Employee">
  <Employee>
    <xsl:apply-templates select=
     "service/Record
           [generate-id()
           =
            generate-id(key('kEmpRecordByVal',
                            concat(generate-id(../..), '+', .)
                            )[1]
                        )
           ]
     "/>
  </Employee>
 </xsl:template>
</xsl:stylesheet>

次のXMLドキュメントに適用した場合(読みやすくするために、2番目のXMLドキュメントに異なる値が提供されていますEmployee):

<Root>
    <Employee>
        <service>
            <Record>xxx</Record>
            <Record>yyy</Record>
        </service>
        <service>
            <Record>xxx</Record>
            <Record>yyy</Record>
            <Record>zzz</Record>
        </service>
    </Employee>
    <Employee>
        <service>
            <Record>aaa</Record>
            <Record>bbb</Record>
        </service>
        <service>
            <Record>aaa</Record>
            <Record>bbb</Record>
            <Record>ccc</Record>
        </service>
    </Employee>
</Root>

必要な正しい結果が生成されます。

<Root>
   <Employee>
      <Record>xxx</Record>
      <Record>yyy</Record>
      <Record>zzz</Record>
   </Employee>
   <Employee>
      <Record>aaa</Record>
      <Record>bbb</Record>
      <Record>ccc</Record>
   </Employee>
</Root>
于 2012-04-27T12:56:53.023 に答える