XSLT Pivot动态列

时间:2017-01-19 21:27:25

标签: xml xslt xslt-2.0

我正在尝试对输入XML数据进行分组和转换并转换为JSON,我大部分工作,除了我认为的dymanic列名称 这是我目前的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>

以下是文件中的示例

<?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”,使用静态ColumnName和measResult(对我来说不起作用)或者代码更容易编码XML中的“VSCEULMEANULGROUP”=“14.65”

{
  "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":""
      }
    ]
  }
}

1 个答案:

答案 0 :(得分: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>