2016-07-06 17 views
0

XMLデータを読み込み、フォーマットしようとしています。私はXSLTを使用してデータを読んでいます。私はその問題に直面しています。誰かが私を助けてくれましたか?値が存在しない場合の空白ノードの作成

私は親ノードが1つしかなく、残りのXML階層はフラットな階層であるXML入力を持っています。

<employee> 
    <Name>ABC</Name> 
    <Department>IT</Department> 
    <Age>30</Age> 
    <Salary>40000</Salary> 

    <Name>XYZ</Name> 
    <Department>IT</Department> 
    <Age>25</Age> 
    <Salary>30000</Salary> 
</employee> 

ここで、名前ノードは必須ノードであり、残りはオプションノードです。私の要件は、任意のオプションのノードが入力XMLに存在しない場合は、空のノードを作成します。

しかし、私が最初の従業員のノードを持っていない以下のシナリオでは、コードが失敗しています。

<employee> 
    <Name>ABC</Name> 
    <Department>IT</Department> 
    <Age>30</Age> 

    <Name>XYZ</Name> 
    <Department>IT</Department> 
    <Age>25</Age> 
    <Salary>30000</Salary> 
</employee> 

私が書いたコードは、すべてのデータが

<employee> 
    <Name>ABC</Name> 
    <Department>IT</Department> 
    <Age>30</Age> 
    <Salary>30000</Salary> 
    <Name>XYZ</Name> 
    <Department>IT</Department> 
    <Age>25</Age> 
    <Salary></Salary> 
</employee> 

以下のようなその与えて出力入力ではなく、言及したシナリオに来ているとき、これが正常に動作している

<xsl:element name="Employee_Information"> 
    <xsl:for-each select="Name"> 
     <xsl:variable name="positionVariable"> 
      <xsl:value-of select="position()"/> 
     </xsl:variable> 
     <xsl:element name="Employee_Name"> 
      <xsl:value-of select="."/> 
     </xsl:element> 
     <xsl:element name="Employee_Dept"> 
      <xsl:value-of select="../Department[number($positionVariable)]"/> 
     </xsl:element> 
     <xsl:element name="Employee_Name"> 
      <xsl:value-of select="../Age[number($positionVariable)]"/> 
     </xsl:element> 
     <xsl:element name="Employee_Name"> 
      <xsl:value-of select="../Salary[number($positionVariable)]"/> 
     </xsl:element> 
    </xsl:for-each> 
</xsl:element> 

です間違った従業員のブランクノードを作成します。 2番目の従業員の空白ノードを作成し、最初の従業員の空ノードを作成する必要があります。

その他の情報が必要な場合はお知らせください。 ありがとうございます。 Kaushik

+0

あなたはXSLT 1.0を使用しています2.0? –

+0

私はXSLT 1.0を使用しています –

答えて

0

基本的に、これはグループ化の問題です。 XSLT 2.0では、使用して解決するために些細なことになります。XSLT 1.0に相当するものを行う

<xsl:for-each-group select="*" group-starting-with="Name"> 

は少しトリッキーです:

XSLT 1.0

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

<xsl:key name="grp" match="Department|Age|Salary" use="generate-id(preceding-sibling::Name[1])" /> 

<xsl:template match="/employee"> 
    <Employee_Information> 
     <xsl:for-each select="Name"> 
      <xsl:variable name="current-group" select="key('grp', generate-id())" /> 
      <Employee_Name> 
       <xsl:value-of select="." /> 
      </Employee_Name> 
      <Employee_Dept> 
       <xsl:value-of select="$current-group[self::Department]" /> 
      </Employee_Dept> 
      <Employee_Age> 
       <xsl:value-of select="$current-group[self::Age]" /> 
      </Employee_Age> 
      <Employee_Salary> 
       <xsl:value-of select="$current-group[self::Salary]" /> 
      </Employee_Salary> 
     </xsl:for-each> 
    </Employee_Information> 
</xsl:template> 

</xsl:stylesheet> 
+0

うわー!!その作業..非常にマイケルソリューションのためにありがとう。 –

+0

完了..ありがとう:) –