2017-01-19 3 views
1

을 나는 그룹과 피벗 입력 XML 데이터에 노력하고 JSON으로 변환하고있어, 나는 내가 dymanic 열 이름을 고려 무엇 이외의 작업의 대부분을 이 내 현재 XSLT이다XSLT 피벗 동적 열

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0"> 
    <xsl:output method="text" encoding="utf-8"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="root"> 
     <xsl:text>{"root":{</xsl:text> 
     <xsl:text>"Table":[</xsl:text> 
     <xsl:for-each-group select="Metric[@TableName != '']" group-by="@measObjLdn"> 
      <xsl:sort select="current-grouping-key()"/> 
      <xsl:variable name="curr_key" select="current-grouping-key()"/> 
      <xsl:for-each-group select="current-group()[@TableName!='']" group-by="@TableName"> 
       <xsl:sort select="current-grouping-key()"/> 
       <xsl:text>{"TableName":"</xsl:text> 
       <xsl:value-of select="current-grouping-key()"/> 
       <xsl:text>",</xsl:text> 
       <xsl:text>"Stamp":"</xsl:text> 
       <xsl:value-of select="@BeginTime"/> 
       <xsl:text>",</xsl:text> 
       <xsl:text>"measObjLdn":"</xsl:text> 
       <xsl:value-of select="$curr_key"/> 
       <xsl:text>",</xsl:text> 
       <xsl:text>"Element_Type":"</xsl:text> 
       <xsl:value-of select="@Element_Type"/> 
       <xsl:text>",</xsl:text> 
       <xsl:text>"Key1":"</xsl:text> 
       <xsl:value-of select="@Key1"/> 
       <xsl:text>"</xsl:text> 
       <xsl:for-each select="current-group()"> 
        <xsl:for-each select="@ColumnName"> 
          <xsl:text>,"</xsl:text> 
          <xsl:value-of select="."/> 
          <xsl:text>":"</xsl:text> 
          <xsl:value-of select="@measResult"/> 
          <xsl:text>"</xsl:text> 
        </xsl:for-each> 
       </xsl:for-each> 
       <xsl:text>}</xsl:text> 
       <xsl:if test="position() != last()"> 
        <xsl:text>,</xsl:text> 
       </xsl:if> 
      </xsl:for-each-group> 
      <xsl:if test="position() != last()"> 
       <xsl:text>,</xsl:text> 
      </xsl:if> 
     </xsl:for-each-group> 
     <xsl:text>]}}</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

는 다음의 XSLT의 출력은 다음과됩니다

<?xml version="1.0" encoding="UTF-8"?> 
<root xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <Metric measType="50332573" 
      infoid="50331655" 
      measResult="768" 
      h50332573="768" 
      BeginTime="2016-12-29T23:30:00-07:00" 
      measObjLdn="THAB23626/ULGROUP:UL BB Resource Group No.=0" 
      Element_Type="ULGROUP" 
      Key1="THAB23626/ULGROUP:=0" 
      TableName="HH_CORE_BASE" 
      ColumnName="VSCEULAVAILABLEULGROUP" 
      VSCEULAVAILABLEULGROUP="768"/> 
    <Metric measType="50332574" 
      infoid="50331655" 
      measResult="14.65" 
      h50332574="14.65" 
      BeginTime="2016-12-29T23:30:00-07:00" 
      measObjLdn="THAB23626/ULGROUP:UL BB Resource Group No.=0" 
      Element_Type="ULGROUP" 
      Key1="THAB23626/ULGROUP:=0" 
      TableName="HH_CORE_BASE" 
      ColumnName="VSCEULMEANULGROUP" 
      VSCEULMEANULGROUP="14.65"/> 
    <Metric measType="50342574" 
      infoid="50331655" 
      measResult="8.5" 
      h50342574="8.5" 
      BeginTime="2016-12-29T23:30:00-07:00" 
      measObjLdn="THAB23626/ULGROUP:UL BB Resource Group No.=0" 
      Element_Type="ULGROUP" 
      Key1="THAB23626/ULGROUP:=0" 
      TableName="HH_CORE_BASE" 
      ColumnName="VSCEULMINULGROUP" 
      VSCEULMINULGROUP="8.5"/> 
    <Metric measType="50342575" 
      infoid="50331655" 
      measResult="23.5" 
      h50342575="23.5" 
      BeginTime="2016-12-29T23:30:00-07:00" 
      measObjLdn="THAB23626/ULGROUP:UL BB Resource Group No.=0" 
      Element_Type="ULGROUP" 
      Key1="THAB23626/ULGROUP:=0" 
      TableName="HH_CORE_BASE" 
      ColumnName="VSCEULMAXULGROUP" 
      VSCEULMAXULGROUP="23.5"/> 
    <Metric measType="50342635" 
      infoid="50331655" 
      measResult="0" 
      h50342635="0" 
      BeginTime="2016-12-29T23:30:00-07:00" 
      measObjLdn="THAB23626/ULGROUP:UL BB Resource Group No.=0" 
      Element_Type="ULGROUP" 
      Key1="THAB23626/ULGROUP:=0" 
      TableName=""/> 
</root>    

파일의 샘플입니다 그러나 내가 열, 즉 "VSCEULMEANULGROUP"에서 값 누락 : "14.65"을, 그것 인을 사용하여 코드를 쉽게 정적 ColumnName 및 measResult (나를 위해 작동하지 않습니다) 또는 "VSCEULME 는 XML

{ 
    "root":{ 
    "Table":[{ 
     "TableName":"HH_CORE_BASE", 
     "Stamp":"2016-12-29T23:30:00-07:00", 
     "measObjLdn":"THAB23626/ULGROUP:UL BB Resource Group No.=0", 
     "Element_Type":"ULGROUP", 
     "Key1":"THAB23626/ULGROUP:=0", 
     "VSCEULAVAILABLEULGROUP":"", 
     "VSCEULMEANULGROUP":"", 
     "VSCEULMINULGROUP":"", 
     "VSCEULMAXULGROUP":"" 
     } 
    ] 
    } 
} 
+0

더 많은 사람들이 질문을 연구하기를 원할 경우, 그것을 단순화하는 것이 좋습니다. foo와 bar라는 두 가지 속성으로 문제가 완벽하게 잘 설명 될 수있는 경우 VSCEULAVAILABLEULGROUP과 같은 20 개의 속성을 통해 웨이드하지 않아도됩니다. –

답변

1

짧은 대답에서 ANULGROUP가 "="14.65 "에 있다는 것입니다 :

<xsl:for-each select="@ColumnName"> 
    <xsl:text>,"</xsl:text> 
    <xsl:value-of select="."/> 
    <xsl:text>":"</xsl:text> 
    <xsl:value-of select="@measResult"/> 
    <xsl:text>"</xsl:text> 
</xsl:for-each> 

문맥하지 않는 ColumnName 속성입니다/measResult라는 이름의 속성을 가질 수 없습니다. 부모/포함 요소로 되돌아 가야합니다.

<xsl:for-each select="@ColumnName"> 
    <xsl:text>,"</xsl:text> 
    <xsl:value-of select="."/> 
    <xsl:text>":"</xsl:text> 
    <xsl:value-of select="../@measResult"/><!--CHANGED THIS LINE--> 
    <xsl:text>"</xsl:text> 
</xsl:for-each> 
+0

감사합니다. 그렇습니다. 나는 계층 구조를 올라야 할 필요가 있음을 알고 있었지만 어떻게 – user1854326