2016-07-06 2 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> 
    <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> 

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

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

내가 작성한 코드는 잘못된 직원을위한 빈 노드를 만듭니다. 첫 번째 직원에 대해 빈 노드를 만들어야하는 두 번째 직원의 빈 노드 만들기.

다른 정보가 필요하면 알려주십시오. 대단히 감사드립니다. Kaushik

+0

는 XSLT 1.0을 사용하고 있습니까 :

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

XSLT 1.0 등가을하는 더 까다로운 조금이다 : XSLT 2.0에서는 사용하여 해결하기 위해 사소한 것 또는 2.0? –

+0

XSLT 1.0을 사용하고 있습니다. –

답변

0

기본적으로 이것은 그룹화입니다.

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

와우 !! 그것의 근무 .. 솔루션에 대한 Michael 대단히 감사합니다. –

+0

완료 .. 감사합니다 :) –

관련 문제