2017-01-19 2 views
1

Я пытаюсь группировать данные и ввод сводной XML и конвертировать в формат JSON, у меня есть большинство рабочих, кроме того, что я считаю, что имя столбца dymanic Это мой текущий XSLTXSLT Pivot Динамические столбцы

<?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> 

Ниже приведен пример в файле

<?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>    

выход из XSLT является следует, однако, я пропускаю значение из столбца, т.е. «VSCEULMEANULGROUP»: «14,65», это проще код, используя static ColumnName и measResult (который не работает для меня) или «VSCEULME ANULGROUP «=» 14,65" из 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

Если вы хотите, чтобы больше людей изучали вопрос, подумайте об упрощении его. Нам не нужно пробираться через 20 атрибутов с такими именами, как VSCEULAVAILABLEULGROUP, когда проблема может быть хорошо проиллюстрирована двумя атрибутами, называемыми foo и bar. –

ответ

1

Короткий ответ, что в:

<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