1

2、3、または 4 つの子を持つカスタム型がいくつかあります。したがって、これらの子を取得するたびに、出力 XML の親タグ自体である単一の要素に結合する必要があります。試してみましたが、xslt の経験がないためできませんでした。誰でも助けることができますか?

私の入力 XML。

<PERSON>
  <ID>194</ID>
  <NAME>IKHAJA</NAME>
  <DETAILS>
     <NUMBER>100</NUMBER>
     <Description />
     <NUMBER01 />
     <NUMBER02>Test</NUMBER02>
  </DETAILS>
  <STATUS>
     <NUMBER>ACTIVE</NUMBER>
     <Description>ACTIVE</Description>
     <NUMBER01 />
     <NUMBER02>ACTIVE</NUMBER02>
  </STATUS>
  <employer>
     <ID>123456</ID>
     <FNAME>EMPLOYER F NAME</FNAME>
     <LNAME>EMPLOYER L NAME</LNAME>
  </employer>
  <PERSON_OFF>
     <TYPE>
         <NUMBER>41</NUMBER>
         <Description>AMPLIFIERS</Description>
         <NUMBER01>77</NUMBER01>
         <NUMBER02 />
     </TYPE>
     <REPORT>
         <NUMBER />
         <Description />
         <NUMBER01 />
         <NUMBER02 />
     </REPORT>
     <SERIAL>111</SERIAL>
     <ADDITIONAL_DESC>TEST</ADDITIONAL_DESC>
     <KEY>5</KEY>
     <CREATED_BY>Test Guy</CREATED_BY>
     <CREATED_ON>2013-03-13T10:03:00</CREATED_ON>
     <PERSON_OFF_ONE>
         <BULK>
            <NUMBER>98078</NUMBER>
            <Description>BULK</Description>
            <NUMBER01 />
            <NUMBER02>8563</NUMBER02>
         </BULK>
         <CHECKED>Y</CHECKED>
     </PERSON_OFF_ONE>
  </PERSON_OFF>
</PERSON>

出力 XML は次のようになります。

<PERSON>
   <ID>194</ID>
   <NAME>IKHAJA</NAME>
   <DETAILS>100;;;Test</DETAILS>
   <STATUS>ACTIVE;ACTIVE;;ACTIVE</STATUS>
   <employer>123456:EMPLOYER F NAME,EMPLOYER L NAME</employer>
   <PERSON_OFF>
       <TYPE>41;AMPLIFIERS;77;</TYPE>
       <REPORT>;;;</REPORT>
       <SERIAL>111</SERIAL>
       <ADDITIONAL_DESC>TEST</ADDITIONAL_DESC>
       <KEY>5</KEY>
       <CREATED_BY>Test Guy</CREATED_BY>
       <CREATED_ON>2013-03-13T10:03:00</CREATED_ON>
       <PERSON_OFF_ONE>
            <BULK>98078;BULK;;8563</BULK>
            <CHECKED>Y</CHECKED>
       </PERSON_OFF_ONE>
   </PERSON_OFF>
</PERSON>

ここで詳細、ステータス、バルクなどを確認すると、子ノード NUMBER、Description、NUMBER01、NUMBRER02 を持つカスタム タイプです。そして、それらを区切り記号「;」で組み合わせる必要があります。それらが空またはnullの場合、「;;;」になります REPORTフィールドに示されているように、宛先列に。

また、雇用主のような雇用者タイプのフィールドがいくつかあり、雇用者の ID、FNAME、LNAME があり、雇用者フィールドに示されているように、それらを ID: FNAME、LNAME として結合する必要があります。

1 つのカスタム タイプの処理方法を知っていれば、他のタイプも簡単に処理できると思います。

助けていただけますか?私はすでにこれに丸一日を費やしており、これをできるだけ早く行う必要があります.

4

2 に答える 2

0

これを試してください:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

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

  <xsl:template match="DETAILS | STATUS | TYPE | REPORT | BULK">
    <xsl:copy>
      <xsl:apply-templates select="*" mode="delimit" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*[position() > 1]" mode="delimit">
    <xsl:value-of select="concat(';', .)"/>
  </xsl:template>

  <xsl:template match="employer">
    <xsl:copy>
      <xsl:apply-templates select="*" mode="idlist" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="ID" mode="idlist">
    <xsl:value-of select="concat(., ':')" />
  </xsl:template>

  <xsl:template match="*[not(self::ID)][position() > 1]" mode="idlist">
    <xsl:value-of select="concat(',', .)" />
  </xsl:template>
</xsl:stylesheet>

サンプル入力で実行すると、結果は次のようになります。

<PERSON>
  <ID>194</ID>
  <NAME>IKHAJA</NAME>
  <DETAILS>100;;;Test</DETAILS>
  <STATUS>ACTIVE;ACTIVE;;ACTIVE</STATUS>
  <employer>123456:EMPLOYER F NAME,EMPLOYER L NAME</employer>
  <PERSON_OFF>
    <TYPE>41;AMPLIFIERS;77;</TYPE>
    <REPORT>;;;</REPORT>
    <SERIAL>111</SERIAL>
    <ADDITIONAL_DESC>TEST</ADDITIONAL_DESC>
    <KEY>5</KEY>
    <CREATED_BY>Test Guy</CREATED_BY>
    <CREATED_ON>2013-03-13T10:03:00</CREATED_ON>
    <PERSON_OFF_ONE>
      <BULK>98078;BULK;;8563</BULK>
      <CHECKED>Y</CHECKED>
    </PERSON_OFF_ONE>
  </PERSON_OFF>
</PERSON>
于 2013-04-04T16:29:31.910 に答える