2017-02-08 9 views
0

以下は、reasoncase要素が繰り返している入力XMLです。reasonCaseのコードが申請者から始まり、申請者を作成している場合。xsltのフィールド値に基づいて繰り返される要素を作成する

<input> 
    <case> 
     <reasonCase> 
      <code>Applicant#1234</code> 
      <key>asd345</key> 
     </reasonCase> 
     <reasonCase> 
      <code>Applicant#1234</code> 
      <key>asd34567</key> 
     </reasonCase> 
     <reasonCase> 
      <code>Applicant#3456</code> 
      <key>asd1111</key> 
     </reasonCase> 
     <reasonCase> 
      <code>Applicant#7889</code> 
      <key>asd9999</key> 
     </reasonCase> 
    </case> 
</input> 

期待出力=同じ値のreasonCase下コードもreasonCase /コードに基づい

<output> 
     <case> 
      <applicant> 
       <objectid>1234</objectid> 
       <reason> 
        <key>asd345</key> 
       </reason> 
       <reason> 
        <key>asd34567</key> 
       </reason> 
      </applicant> 
      <applicant> 
       <objectid>3456</objectid> 
       <reason> 
        <key>asd1111</key> 
       </reason> 
      </applicant> 
      <applicant> 
       <objectid>7889</objectid> 
       <reason> 
        <key>asd9999</key> 
       </reason> 
      </applicant> 
     </case> 
    </output> 

同じ出願人の要素でなければならない出力と対応する要素に同じ出願人の要素であるべきですstart-with(申請者)は、申請者とそれに対応する要素の繰り返しを作成する必要があります。
は、私は私が得た出力が期待される出力を得るために私を助けてください

<output> 
    <Applicants> 
     <objectId>1234</objectId> 
     <reason> 
      <key>asd345</key> 
     </reason> 
    </Applicants> 
    <Applicants> 
     <objectId>1234</objectId> 
     <reason> 
      <key>asd345</key> 
     </reason> 
    </Applicants> 
    <Applicants> 
     <objectId>3456</objectId> 
     <reason> 
      <key>asd1111</key> 
     </reason> 
    </Applicants> 
    <Applicants> 
     <objectId>7889</objectId> 
     <reason> 
      <key>asd9999</key> 
     </reason> 
    </Applicants> 
</output> 

以下の通りです

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <xsl:output method="xml"/> 
     <xsl:template match="/"> 
      <output> 
       <xsl:for-each select="/input/case/reasonCase"> 
        <xsl:variable name="code"> 
         <xsl:value-of select="./code"/> 
        </xsl:variable> 
        <xsl:choose> 
         <xsl:when test="starts-with(./code,'Applicant')"> 
          <Applicants> 
           <objectId> 
            <xsl:value-of select="substring-after(/*/*/*[code=$code]/code,'Applicant#')"/> 
           </objectId> 
           <reason> 
            <key><xsl:value-of select="/*/*/*[code=$code]/key"/></key> 
           </reason> 
          </Applicants> 
         </xsl:when> 
        </xsl:choose> 
       </xsl:for-each> 
      </output> 
     </xsl:template> 
    </xsl:stylesheet> 

をしようとした以下のXSLTを見つけてください。 Xslを1.0用

+0

正確にあなたはこれにこだわっていますか? –

+0

私は上記のような要件を持っています。私は同じロジックを実装することができません。ロジックの助けが必要です。 – user1731504

+0

あなたのコードを書くのはここにはありません。具体的な質問や難しさがある場合は、あなたの試行を示して、それを修正する方法を尋ねます。 –

答えて

0

この問題のXSLT

<xsl:template match="input"> 
    <output> 
     <case> 
      <xsl:for-each-group select="//code" group-by="text()"> 
       <xsl:variable name="code" select="text()"/> 
       <applicant> 
        <objectid><xsl:value-of select="substring-after(text(), '#')"/></objectid> 
        <xsl:for-each select="//key[preceding-sibling::code = $code]"> 
         <reason> 
          <xsl:copy-of select="."/> 
         </reason> 
        </xsl:for-each> 
       </applicant> 
      </xsl:for-each-group> 
     </case> 
    </output> 
</xsl:template> 

と出力

<?xml version="1.0" encoding="UTF-8"?> 
<output> 
    <case> 
     <applicant> 
     <objectid>1234</objectid> 
     <reason> 
      <key>asd345</key> 
     </reason> 
     <reason> 
      <key>asd34567</key> 
     </reason> 
     </applicant> 
     <applicant> 
     <objectid>3456</objectid> 
     <reason> 
      <key>asd1111</key> 
     </reason> 
     </applicant> 
     <applicant> 
     <objectid>7889</objectid> 
     <reason> 
      <key>asd9999</key> 
     </reason> 
     </applicant> 
    </case> 
</output> 
+0

ありがとうございますが、xslt 1.0のバージョン – user1731504

+0

でこれが必要です。更新されたxslt 1.0を見ることができます。 – Rupesh

+0

' zx485

1

あなたは、このために

<xsl:template match="input"> 
<output> 
    <case> 
     <xsl:for-each select="//code[.!=preceding::code or not(preceding::code)]"> 
      <xsl:variable name="code" select="text()"/> 
      <Applicants> 
       <objectid><xsl:value-of select="substring-after(text(), '#')"/></objectid> 
       <xsl:for-each select="//key[preceding-sibling::code = $code]"> 
        <reason> 
         <xsl:copy-of select="."/> 
        </reason> 
       </xsl:for-each> 
      </Applicants> 
     </xsl:for-each> 
    </case> 
</output> 

と出力を使用することができます

です
<?xml version="1.0" encoding="UTF-8"?> 
<output> 
    <case> 
     <Applicants> 
     <objectid>1234</objectid> 
     <reason> 
      <key>asd345</key> 
     </reason> 
     <reason> 
      <key>asd34567</key> 
     </reason> 
     </Applicants> 
     <Applicants> 
     <objectid>3456</objectid> 
     <reason> 
      <key>asd1111</key> 
     </reason> 
     </Applicants> 
     <Applicants> 
     <objectid>7889</objectid> 
     <reason> 
      <key>asd9999</key> 
     </reason> 
     </Applicants> 
    </case> 
</output> 
+0

これは良い方法ではありません - ここを参照してください理由:http://www.jenitennison.com/xslt/grouping/muenchian.html –

関連する問題