2016-12-20 11 views
0

ノードに複数のタグがありますが、条件に基づいて1つのタグに結合することはできません。XSLT変換:条件に基づいて複数のタグを1つのタグに結合します

それぞれの人は、複数のJobInfoタグと、それに続く複数のEmpInfoを順番に持っています。私は第1のJobInfoを第1のEmpInfoにマージし、第2のJobInfoを第2のEmpInfoにマージしたい場合は、「適用中」インジケータが「Y」であり、それらをEmpJobInfoタグとして変換する必要があります。

<soap:Envelope xmlns:soap="schemas.xmlsoap.org/soap/envelope/"> 
<soap:Body> 
<App> 
<person> 
<answerSet> 
    <answers> 
     <entry> 
      <key>monthlyIncome</key> 
      <value>1200</value> 
     </entry> 
    </answers> 
    <answers> 
     <entry> 
      <key>Applying</key> 
      <value>Y</value> 
     </entry> 
    </answers> 
    <key>JobInfo</key> 
</answerSet> 
<answerSet> 
    <answers> 
     <entry> 
      <key>monthlyIncome</key> 
      <value>800</value> 
     </entry> 
    </answers> 
    <answers> 
     <entry> 
      <key>Applying</key> 
      <value>Y</value> 
     </entry> 
    </answers> 
    <key>JobInfo</key> 
</answerSet> 
<answerSet> 
    <answers> 
     <entry> 
      <key>monthlyIncome</key> 
      <value>450</value> 
     </entry> 
    </answers> 
    <answers> 
     <entry> 
      <key>Applying</key> 
      <value>N</value> 
     </entry> 
    </answers> 
    <key>JobInfo</key> 
</answerSet> 
<answerSet> 
    <answers> 
     <entry> 
      <key>EmpName</key> 
      <value>Walmart</value> 
     </entry> 
    </answers> 
    <key>EmpInfo</key> 
</answerSet> 
<answerSet> 
    <answers> 
     <entry> 
      <key>EmpName</key> 
      <value>Target</value> 
     </entry> 
    </answers> 
    <key>EmpInfo</key> 
</answerSet> 
</person> 
</App> 
</soap:Body> 
</soap:Envelope> 

私は現在、各タグの位置を取得し、他のものと結合する以下のXSLTを使用しています。しかし、それは '適用'が 'Y'であるかどうかをチェックしません。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:template match="*"> 
    <App> 
     <xsl:for-each select="//person"> 
     <xsl:variable name ="person" select="." /> 
     <person> 
      <xsl:for-each select="answerSet[key='EmpInfo']"> 
      <xsl:variable name ="pos" select="position()" /> 
      <answerSet> 
       <xsl:copy-of select="answers" /> 
       <xsl:copy-of select="$person/answerSet[key='JobInfo'][$pos]/answers" /> 
       <key>EmpJobInfo</key> 
      </answerSet> 
      </xsl:for-each> 
     </person> 
     </xsl:for-each> 
    </App> 
    </xsl:template> 
</xsl:stylesheet> 

とあなただけの条件は、その後、私は

<xsl:template match="App"> 
    <App> 
     <xsl:for-each select="//person"> 
      <xsl:variable name ="person" select="." /> 
      <person> 
       <xsl:for-each select="answerSet[key='JobInfo'][answers/entry[key = 'Applying']/value = 'Y']"> 
        <xsl:variable name ="pos" select="position()" /> 
        <answerSet> 
         <xsl:copy-of select="$person/answerSet[key='EmpInfo'][$pos]/answers" /> 
         <xsl:copy-of select="answers[not(entry[key = 'Applying']/value = 'Y')]" /> 
         <key>EmpJobInfo</key> 
        </answerSet> 
       </xsl:for-each> 
      </person> 
     </xsl:for-each> 
    </App> 
</xsl:template> 

にテンプレートを変更すると、その条件を実装するべきだと思い保持するための要素を処理したい場合は、予想される出力は

<App> 
    <person> 
    <answerSet> 
     <answers> 
     <entry> 
      <key>EmpName</key> 
      <value>Walmart</value> 
     </entry> 
     </answers> 
     <answers> 
     <entry> 
      <key>monthlyIncome</key> 
      <value>1200</value> 
     </entry> 
     </answers> 
     <key>EmpJobInfo</key> 
    </answerSet> 
    <answerSet> 
     <answers> 
     <entry> 
      <key>EmpName</key> 
      <value>Target</value> 
     </entry> 
     </answers> 
     <answers> 
     <entry> 
      <key>monthlyIncome</key> 
      <value>800</value> 
     </entry> 
     </answers> 
     <key>EmpJobInfo</key> 
    </answerSet> 
    </person> 
</App> 

答えて

1

です。

関連する問題