jjzjj

xml - XSL 1.0 带空标签的多级分组

coder 2024-07-02 原文

这是我第一次在这里发帖,所以对于篇幅以及任何格式问题或信息缺失,我深表歉意。我已经在这个问题上工作了几天,我已经广泛研究了我的问题,但还没有找到解决方案,所以我希望这里有人可以帮助我。这是一个与 xslt 相关的问题,我几个月前才开始用 xslt 编码,所以我不是很有经验。

基本上,我有一个输入 XML,它可能包含重复记录和空标签,我需要将它们重新组织成一个 javascript 关联数组,以便能够在客户端有效地操作和显示值。

我的问题是:有没有办法在使用的字段标签为空的情况下进行多级分组。如果没有,有没有一种方法可以通过用关键字替换空标记然后应用其余模板来编辑 xsl 中的 xml?

要了解我的问题,请查看详细信息。 这是我的输入 XML

<cds>
    <sections>
        <section name="myteam_CurrentAgeCompleteSection" link="false">
            <detail name="">
                <record>
                    <field name="AGERANGEID">30-39</field>
                    <field name="NUMOFCOUNTAGE">1</field>
                    <field name="ORGUNITID">00001001</field>
                    <field name="PARENTORGUNITID">00000100</field>
                    <field name="ORGUNITNAME">Human Resources</field>
                </record>
                <record>
                    <field name="AGERANGEID">&gt;=70</field>
                    <field name="NUMOFCOUNTAGE">5</field>
                    <field name="ORGUNITID">00001001</field>
                    <field name="PARENTORGUNITID">00000100</field>
                    <field name="ORGUNITNAME">Human Resources</field>
                </record>
            </detail>
        </section>
        <section name="myteam_CurrentGenderCompleteSection" link="false">
            <detail name="">
                <record>
                    <field name="PARENTORGUNITID">00000100</field>
                    <field name="ORGUNITID">00001001</field>
                    <field name="ORGUNITNAME">Human Resources</field>
                    <field name="NUMOFGENDERCOUNT">5</field>
                    <field name="GENDER">2</field>
                </record>
                <record>
                    <field name="PARENTORGUNITID">00000100</field>
                    <field name="ORGUNITID">00001001</field>
                    <field name="ORGUNITNAME">Human Resources</field>
                    <field name="NUMOFGENDERCOUNT">7</field>
                    <field name="GENDER">1</field>
                </record>
            </detail>
        </section>
        <section name="myteam_CurrentRaceCompleteSection" link="false">
            <detail name="">
                <record>
                    <field name="ORGUNITNAME">Human Resources</field>
                    <field name="PARENTORGUNITID">00000100</field>
                    <field name="ORGUNITID">00001001</field>
                    <field name="NUMOFRACE">10.0</field>
                    <field name="RACENAME" />
                </record>
                <record>
                    <field name="ORGUNITNAME">Human Resources</field>
                    <field name="PARENTORGUNITID">00000100</field>
                    <field name="ORGUNITID">00001001</field>
                    <field name="NUMOFRACE">1</field>
                    <field name="RACENAME">Asian</field>
                </record>
                <record>
                    <field name="ORGUNITNAME">Human Resources</field>
                    <field name="PARENTORGUNITID">00000100</field>
                    <field name="ORGUNITID">00001001</field>
                    <field name="NUMOFRACE">1</field>
                    <field name="RACENAME">American Indian</field>
                </record>
            </detail>
        </section>
        <section name="myteam_ChildAgeColumnSection" link="false">
            <detail name="">
                <record>
                    <field name="AGERANGEID">40-49</field>
                    <field name="NUMOFCOUNTAGE">1</field>
                    <field name="ORGUNITID">50000013</field>
                    <field name="PARENTORGUNITID">00001001</field>
                    <field name="ORGUNITNAME">IT computer center (D)</field>
                </record>
                <record>
                    <field name="AGERANGEID">50-59</field>
                    <field name="NUMOFCOUNTAGE">2</field>
                    <field name="ORGUNITID">50000013</field>
                    <field name="PARENTORGUNITID">00001001</field>
                    <field name="ORGUNITNAME">IT computer center (D)</field>
                </record>
                <record>
                    <field name="AGERANGEID">&gt;=70</field>
                    <field name="NUMOFCOUNTAGE">5</field>
                    <field name="ORGUNITID">50000013</field>
                    <field name="PARENTORGUNITID">00001001</field>
                    <field name="ORGUNITNAME">IT computer center (D)</field>
                </record>
            </detail>
        </section>

        <section name="myteam_ChildGenderColumnSection" link="false">
            <detail name="">
                <record>
                    <field name="PARENTORGUNITID">00001001</field>
                    <field name="ORGUNITID">50000013</field>
                    <field name="ORGUNITNAME">IT computer center (D)</field>
                    <field name="NUMOFGENDERCOUNT">4</field>
                    <field name="GENDER">2</field>
                </record>
                <record>
                    <field name="PARENTORGUNITID">00001001</field>
                    <field name="ORGUNITID">50000147</field>
                    <field name="ORGUNITNAME">Personnel Administration (D)</field>
                    <field name="NUMOFGENDERCOUNT">3</field>
                    <field name="GENDER">1</field>
                </record>
                <record>
                    <field name="PARENTORGUNITID">00001001</field>
                    <field name="ORGUNITID">50000013</field>
                    <field name="ORGUNITNAME">IT computer center (D)</field>
                    <field name="NUMOFGENDERCOUNT">4</field>
                    <field name="GENDER">1</field>
                </record>
            </detail>
        </section>
        <section name="myteam_ChildGenderColumnSection" link="false">
            <detail name="">
                <record>
                    <field name="PARENTORGUNITID">00001001</field>
                    <field name="ORGUNITID">50000013</field>
                    <field name="ORGUNITNAME">IT computer center (D)</field>
                    <field name="NUMOFGENDERCOUNT">4</field>
                    <field name="GENDER">2</field>
                </record>
                <record>
                    <field name="PARENTORGUNITID">00001001</field>
                    <field name="ORGUNITID">50000147</field>
                    <field name="ORGUNITNAME">Personnel Administration (D)</field>
                    <field name="NUMOFGENDERCOUNT">3</field>
                    <field name="GENDER">1</field>
                </record>
                <record>
                    <field name="PARENTORGUNITID">00001001</field>
                    <field name="ORGUNITID">50000013</field>
                    <field name="ORGUNITNAME">IT computer center (D)</field>
                    <field name="NUMOFGENDERCOUNT">4</field>
                    <field name="GENDER">1</field>
                </record>
            </detail>
        </section>
        <section name="myteam_ChildGenderColumnSection" link="false">
            <detail name="">
                <record>
                    <field name="PARENTORGUNITID">00001001</field>
                    <field name="ORGUNITID">50000013</field>
                    <field name="ORGUNITNAME">IT computer center (D)</field>
                    <field name="NUMOFGENDERCOUNT">4</field>
                    <field name="GENDER">2</field>
                </record>
                <record>
                    <field name="PARENTORGUNITID">00001001</field>
                    <field name="ORGUNITID">50000147</field>
                    <field name="ORGUNITNAME">Personnel Administration (D)</field>
                    <field name="NUMOFGENDERCOUNT">3</field>
                    <field name="GENDER">1</field>
                </record>
            </detail>
        </section>
    </sections>
</cds>

上网查了一下,发现处理多级分组最好的方法是使用xsl:key和generate-id()。效果很好,数据完全按照我的意愿输出,所以我的 xsl 流是正确的。但不幸的是,如果 xsl:key 中使用的字段是一个空标记,当我使用 concat() 进入多级分组时,它会失败。

<!-- Start external variables -->   
<!-- Field names -->
<xsl:variable name="ageFieldName" select="'AGERANGEID'" />
<xsl:variable name="genderFieldName" select="'GENDER'" />
<xsl:variable name="raceFieldName" select="'RACENAME'" />
<xsl:variable name="ouIdFieldName" select="'ORGUNITID'" />
<xsl:variable name="ouNameFieldName" select="'ORGUNITNAME'" />

<!-- Keys -->   
<xsl:key use="field[@name='AGERANGEID']" name="AGERANGEID" match="detail/record" />
<xsl:key use="concat(field[@name='AGERANGEID'],'|', field[@name='ORGUNITID'])" name="AGERANGEID_merge" match="detail/record" />
<xsl:key use="field[@name='GENDER']" name="GENDER" match="detail/record" />
<xsl:key use="concat(field[@name='GENDER'],'|', field[@name='ORGUNITID'])" name="GENDER_merge" match="detail/record" />
<xsl:key use="field[@name='RACENAME']" name="RACENAME" match="detail/record" />
<xsl:key use="concat(field[@name='RACENAME'],'|', field[@name='ORGUNITID'])" name="RACENAME_merge" match="detail/record" />

<xsl:key use="field[@name='ORGUNITID']" name="ORGUNITID" match="detail/record" />


<xsl:template match="/">
    var analyticsMap = {<xsl:call-template name="buildAnalyticsTable" />};
</xsl:template>

<xsl:template name="buildAnalyticsTable">       
    <!-- Age -->
    "<xsl:value-of select="$ageFieldName"/>" : {
    <xsl:apply-templates mode="buildAnalyticsTableRangeLevel" select="//detail/record[generate-id()=generate-id(key($ageFieldName, field[@name=$ageFieldName]))]">
        <xsl:with-param name="keyName" select="$ageFieldName"/>
        <xsl:with-param name="countField" select="'NUMOFCOUNTAGE'"/>     
        <xsl:with-param name="label" select="'Age Range'" />
        <xsl:with-param name="isGender" select="'false'" />
    </xsl:apply-templates>
    },

    <!-- Gender -->
    "<xsl:value-of select="$genderFieldName"/>" : {
    <xsl:apply-templates mode="buildAnalyticsTableRangeLevel" select="//detail/record[generate-id()=generate-id(key($genderFieldName, field[@name=$genderFieldName]))]">
        <xsl:with-param name="keyName" select="$genderFieldName"/>
        <xsl:with-param name="countField" select="'NUMOFGENDERCOUNT'"/>  
        <xsl:with-param name="label" select="'Gender'" />
        <xsl:with-param name="isGender" select="'true'" />
    </xsl:apply-templates>
    },

    <!-- Race -->
    "<xsl:value-of select="$raceFieldName"/>" : {
    <xsl:apply-templates mode="buildAnalyticsTableRangeLevel" select="//detail/record[generate-id()=generate-id(key($raceFieldName, field[@name=$raceFieldName]))]">
        <xsl:with-param name="keyName" select="$raceFieldName"/>
        <xsl:with-param name="countField" select="'NUMOFRACE'"/>     
        <xsl:with-param name="label" select="'Race'" />
        <xsl:with-param name="isGender" select="'true'" />
    </xsl:apply-templates>
    }

</xsl:template>

<xsl:template match="detail/record" mode="buildAnalyticsTableRangeLevel">
    <xsl:param name="keyName" />
    <xsl:param name="countField" /> 
    <xsl:param name="label" />
    <xsl:param name="isGender" />
    <xsl:variable name="value" >
        <xsl:call-template name="testForUnknown">
            <xsl:with-param name="name" select="field[@name=$keyName]"/>
        </xsl:call-template>
    </xsl:variable>
    <xsl:variable name="name">
        <xsl:call-template name="testForGender">
            <xsl:with-param name="isGender" select="$isGender"/>
            <xsl:with-param name="name" select="$value"/>
        </xsl:call-template>
    </xsl:variable>

    "<xsl:value-of select="$value"/>" : {       
    "analyticsLabel" : "<xsl:value-of select="$label"/>",
    "analyticsName" : "<xsl:value-of select="$name"/>",
    <xsl:apply-templates mode="buildAnalyticsTableCountLevel" select="key($keyName, field[@name=$keyName])[generate-id()=generate-id(key(concat($keyName, '_merge'), concat(field[@name=$keyName],'|', field[@name=$ouIdFieldName])))]">
        <xsl:with-param name="countField" select="$countField"/>
    </xsl:apply-templates>
    },          
</xsl:template>

<xsl:template match="detail/record" mode="buildAnalyticsTableCountLevel">
    <xsl:param name="countField" />
    "<xsl:value-of select="field[@name=$ouIdFieldName]"/>" : {
    "analyticsOUname" : "<xsl:value-of select="field[@name=$ouNameFieldName]"/>",
    "analyticsValue" : "<xsl:value-of select="field[@name=$countField]"/>"
    },
</xsl:template>    

<xsl:template name="testForUnknown">
    <xsl:param name="name" /> 
    <xsl:choose>        
        <xsl:when test="string-length($name) = 0">
            <xsl:value-of select="'Unknown'"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$name" />
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<xsl:template name="testForGender">
    <xsl:param name="isGender" />
    <xsl:param name="name" /> 
    <xsl:choose>
        <xsl:when test="$isGender = 'true' and $name = 1">
            <xsl:value-of select="'male'" />            
        </xsl:when> 
        <xsl:when test="$isGender = 'true' and $name = 2">
            <xsl:value-of select="'female'" />      
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$name" />
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

这是我的转换输出

    var analyticsMap = {        

    "AGERANGEID" : {


    "30-39" : {     
    "analyticsLabel" : "Age Range",
    "analyticsName" : "30-39",

    "00001001" : {
    "analyticsOUname" : "Human Resources",
    "analyticsValue" : "1"
    },

    },          


    "&gt;=70" : {       
    "analyticsLabel" : "Age Range",
    "analyticsName" : "&gt;=70",

    "00001001" : {
    "analyticsOUname" : "Human Resources",
    "analyticsValue" : "5"
    },

    "50000013" : {
    "analyticsOUname" : "IT computer center (D)",
    "analyticsValue" : "5"
    },

    },          


    "40-49" : {     
    "analyticsLabel" : "Age Range",
    "analyticsName" : "40-49",

    "50000013" : {
    "analyticsOUname" : "IT computer center (D)",
    "analyticsValue" : "1"
    },

    },          


    "50-59" : {     
    "analyticsLabel" : "Age Range",
    "analyticsName" : "50-59",

    "50000013" : {
    "analyticsOUname" : "IT computer center (D)",
    "analyticsValue" : "2"
    },

    },          

    },


    "GENDER" : {


    "2" : {     
    "analyticsLabel" : "Gender",
    "analyticsName" : "female",

    "00001001" : {
    "analyticsOUname" : "Human Resources",
    "analyticsValue" : "5"
    },

    "50000013" : {
    "analyticsOUname" : "IT computer center (D)",
    "analyticsValue" : "4"
    },

    },          


    "1" : {     
    "analyticsLabel" : "Gender",
    "analyticsName" : "male",

    "00001001" : {
    "analyticsOUname" : "Human Resources",
    "analyticsValue" : "7"
    },

    "50000147" : {
    "analyticsOUname" : "Personnel Administration (D)",
    "analyticsValue" : "3"
    },

    "50000013" : {
    "analyticsOUname" : "IT computer center (D)",
    "analyticsValue" : "4"
    },

    },          

    },


    "RACENAME" : {


    "Unknown" : {       
    "analyticsLabel" : "Race",
    "analyticsName" : "Unknown",

    },          


    "Asian" : {     
    "analyticsLabel" : "Race",
    "analyticsName" : "Asian",

    "00001001" : {
    "analyticsOUname" : "Human Resources",
    "analyticsValue" : "1"
    },

    },          


    "American Indian" : {       
    "analyticsLabel" : "Race",
    "analyticsName" : "American Indian",

    "00001001" : {
    "analyticsOUname" : "Human Resources",
    "analyticsValue" : "1"
    },

    },          

    }

};

如您所见,在 Race->Unknown 部分,它没有通过应用模板模式“buildAnalyticsTableCountLevel”来完成它,所以我从来没有得到 ORGUNITID 信息,这对我正在做的事情非常重要。

不幸的是,我无法编辑传入的 xml,因为这是在各种项目中使用的更大框架的一部分,我无法更改它。所以我必须利用我得到的东西。

我尝试在 xsl:key 中使用 string() 方法,但这让一切变得更糟。任何提示或帮助表示赞赏。提前致谢!

最佳答案

像这样更改样式表的开头:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my">
 <xsl:output method="text"/>

 <my:unknown>Unknown</my:unknown>

并将其中一个 key 定义更改为:

 <xsl:key name="RACENAME_merge" match="detail/record" 
  use="concat((field[@name='RACENAME']
              |document('')/*/my:unknown[not(field[@name='RACENAME'])]),
              '|', field[@name='ORGUNITID'])"  />

最后,将其中一个 xsl:apply-templaes 更改为:

<xsl:apply-templates mode="buildAnalyticsTableCountLevel"
select="key($keyName, field[@name=$keyName])
          [generate-id()=generate-id(key(concat($keyName, '_merge'),
          concat((field[@name=$keyName]
                 |document('')/*/my:unknown[not(current()/field[@name='RACENAME'])]),
                 '|', field[@name=$ouIdFieldName])))]">
    <xsl:with-param name="countField" select="$countField"/>
</xsl:apply-templates>

这些改动后的完整代码变为:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my">
 <xsl:output method="text"/>

 <my:unknown>Unknown</my:unknown>

 <!-- Start external variables -->
 <!-- Field names -->
 <xsl:variable name="ageFieldName" select="'AGERANGEID'" />
 <xsl:variable name="genderFieldName" select="'GENDER'" />
 <xsl:variable name="raceFieldName" select="'RACENAME'" />
 <xsl:variable name="ouIdFieldName" select="'ORGUNITID'" />
 <xsl:variable name="ouNameFieldName" select="'ORGUNITNAME'" />

 <!-- Keys -->
 <xsl:key use="field[@name='AGERANGEID']" name="AGERANGEID" match="detail/record" />
 <xsl:key use="concat(field[@name='AGERANGEID'],'|', field[@name='ORGUNITID'])" name="AGERANGEID_merge" match="detail/record" />
 <xsl:key use="field[@name='GENDER']" name="GENDER" match="detail/record" />
 <xsl:key use="concat(field[@name='GENDER'],'|', field[@name='ORGUNITID'])" name="GENDER_merge" match="detail/record" />
 <xsl:key use="field[@name='RACENAME']" name="RACENAME" match="detail/record" />
 <xsl:key use="concat((field[@name='RACENAME']
                     |document('')/*/my:unknown[not(current()/field[@name='RACENAME'])]),
                     '|', field[@name='ORGUNITID'])"
  name="RACENAME_merge" match="detail/record" />

 <xsl:key use="field[@name='ORGUNITID']" name="ORGUNITID" match="detail/record" />


 <xsl:template match="/">
    var analyticsMap = {<xsl:call-template name="buildAnalyticsTable" />};
 </xsl:template>

 <xsl:template name="buildAnalyticsTable">
    <!-- Age -->
    "<xsl:value-of select="$ageFieldName"/>" : {
    <xsl:apply-templates mode="buildAnalyticsTableRangeLevel" select="//detail/record[generate-id()=generate-id(key($ageFieldName, field[@name=$ageFieldName]))]">
        <xsl:with-param name="keyName" select="$ageFieldName"/>
        <xsl:with-param name="countField" select="'NUMOFCOUNTAGE'"/>
        <xsl:with-param name="label" select="'Age Range'" />
        <xsl:with-param name="isGender" select="'false'" />
    </xsl:apply-templates>
    },

    <!-- Gender -->
    "<xsl:value-of select="$genderFieldName"/>" : {
    <xsl:apply-templates mode="buildAnalyticsTableRangeLevel" select="//detail/record[generate-id()=generate-id(key($genderFieldName, field[@name=$genderFieldName]))]">
        <xsl:with-param name="keyName" select="$genderFieldName"/>
        <xsl:with-param name="countField" select="'NUMOFGENDERCOUNT'"/>
        <xsl:with-param name="label" select="'Gender'" />
        <xsl:with-param name="isGender" select="'true'" />
    </xsl:apply-templates>
    },

    <!-- Race -->
    "<xsl:value-of select="$raceFieldName"/>" : {
    <xsl:apply-templates mode="buildAnalyticsTableRangeLevel" select="//detail/record[generate-id()=generate-id(key($raceFieldName, field[@name=$raceFieldName]))]">
        <xsl:with-param name="keyName" select="$raceFieldName"/>
        <xsl:with-param name="countField" select="'NUMOFRACE'"/>
        <xsl:with-param name="label" select="'Race'" />
        <xsl:with-param name="isGender" select="'true'" />
    </xsl:apply-templates>
    }

 </xsl:template>

 <xsl:template match="detail/record" mode="buildAnalyticsTableRangeLevel">
    <xsl:param name="keyName" />
    <xsl:param name="countField" />
    <xsl:param name="label" />
    <xsl:param name="isGender" />
    <xsl:variable name="value" >
        <xsl:call-template name="testForUnknown">
            <xsl:with-param name="name" select="field[@name=$keyName]"/>
        </xsl:call-template>
    </xsl:variable>
    <xsl:variable name="name">
        <xsl:call-template name="testForGender">
            <xsl:with-param name="isGender" select="$isGender"/>
            <xsl:with-param name="name" select="$value"/>
        </xsl:call-template>
    </xsl:variable>

    "<xsl:value-of select="$value"/>" : {
    "analyticsLabel" : "<xsl:value-of select="$label"/>",
    "analyticsName" : "<xsl:value-of select="$name"/>",
    <xsl:apply-templates mode="buildAnalyticsTableCountLevel"
    select="key($keyName, field[@name=$keyName])
              [generate-id()=generate-id(key(concat($keyName, '_merge'),
              concat((field[@name=$keyName]
                     |document('')/*/my:unknown[not(current()/field[@name='RACENAME'])]),
                     '|', field[@name=$ouIdFieldName])))]">
        <xsl:with-param name="countField" select="$countField"/>
    </xsl:apply-templates>
    },
 </xsl:template>

 <xsl:template match="detail/record" mode="buildAnalyticsTableCountLevel">
    <xsl:param name="countField" />
    "<xsl:value-of select="field[@name=$ouIdFieldName]"/>" : {
    "analyticsOUname" : "<xsl:value-of select="field[@name=$ouNameFieldName]"/>",
    "analyticsValue" : "<xsl:value-of select="field[@name=$countField]"/>"
    },
 </xsl:template>

 <xsl:template name="testForUnknown">
    <xsl:param name="name" />
    <xsl:choose>
        <xsl:when test="string-length($name) = 0">
            <xsl:value-of select="'Unknown'"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$name" />
        </xsl:otherwise>
    </xsl:choose>
 </xsl:template>

 <xsl:template name="testForGender">
    <xsl:param name="isGender" />
    <xsl:param name="name" />
    <xsl:choose>
        <xsl:when test="$isGender = 'true' and $name = 1">
            <xsl:value-of select="'male'" />
        </xsl:when>
        <xsl:when test="$isGender = 'true' and $name = 2">
            <xsl:value-of select="'female'" />
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$name" />
        </xsl:otherwise>
    </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

并且当此转换应用于提供的 XML 文档时:

<cds>
    <sections>
        <section name="myteam_CurrentAgeCompleteSection" link="false">
            <detail name="">
                <record>
                    <field name="AGERANGEID">30-39</field>
                    <field name="NUMOFCOUNTAGE">1</field>
                    <field name="ORGUNITID">00001001</field>
                    <field name="PARENTORGUNITID">00000100</field>
                    <field name="ORGUNITNAME">Human Resources</field>
                </record>
                <record>
                    <field name="AGERANGEID">&gt;=70</field>
                    <field name="NUMOFCOUNTAGE">5</field>
                    <field name="ORGUNITID">00001001</field>
                    <field name="PARENTORGUNITID">00000100</field>
                    <field name="ORGUNITNAME">Human Resources</field>
                </record>
            </detail>
        </section>
        <section name="myteam_CurrentGenderCompleteSection" link="false">
            <detail name="">
                <record>
                    <field name="PARENTORGUNITID">00000100</field>
                    <field name="ORGUNITID">00001001</field>
                    <field name="ORGUNITNAME">Human Resources</field>
                    <field name="NUMOFGENDERCOUNT">5</field>
                    <field name="GENDER">2</field>
                </record>
                <record>
                    <field name="PARENTORGUNITID">00000100</field>
                    <field name="ORGUNITID">00001001</field>
                    <field name="ORGUNITNAME">Human Resources</field>
                    <field name="NUMOFGENDERCOUNT">7</field>
                    <field name="GENDER">1</field>
                </record>
            </detail>
        </section>
        <section name="myteam_CurrentRaceCompleteSection" link="false">
            <detail name="">
                <record>
                    <field name="ORGUNITNAME">Human Resources</field>
                    <field name="PARENTORGUNITID">00000100</field>
                    <field name="ORGUNITID">00001001</field>
                    <field name="NUMOFRACE">10.0</field>
                    <field name="RACENAME" />
                </record>
                <record>
                    <field name="ORGUNITNAME">Human Resources</field>
                    <field name="PARENTORGUNITID">00000100</field>
                    <field name="ORGUNITID">00001001</field>
                    <field name="NUMOFRACE">1</field>
                    <field name="RACENAME">Asian</field>
                </record>
                <record>
                    <field name="ORGUNITNAME">Human Resources</field>
                    <field name="PARENTORGUNITID">00000100</field>
                    <field name="ORGUNITID">00001001</field>
                    <field name="NUMOFRACE">1</field>
                    <field name="RACENAME">American Indian</field>
                </record>
            </detail>
        </section>
        <section name="myteam_ChildAgeColumnSection" link="false">
            <detail name="">
                <record>
                    <field name="AGERANGEID">40-49</field>
                    <field name="NUMOFCOUNTAGE">1</field>
                    <field name="ORGUNITID">50000013</field>
                    <field name="PARENTORGUNITID">00001001</field>
                    <field name="ORGUNITNAME">IT computer center (D)</field>
                </record>
                <record>
                    <field name="AGERANGEID">50-59</field>
                    <field name="NUMOFCOUNTAGE">2</field>
                    <field name="ORGUNITID">50000013</field>
                    <field name="PARENTORGUNITID">00001001</field>
                    <field name="ORGUNITNAME">IT computer center (D)</field>
                </record>
                <record>
                    <field name="AGERANGEID">&gt;=70</field>
                    <field name="NUMOFCOUNTAGE">5</field>
                    <field name="ORGUNITID">50000013</field>
                    <field name="PARENTORGUNITID">00001001</field>
                    <field name="ORGUNITNAME">IT computer center (D)</field>
                </record>
            </detail>
        </section>
        <section name="myteam_ChildGenderColumnSection" link="false">
            <detail name="">
                <record>
                    <field name="PARENTORGUNITID">00001001</field>
                    <field name="ORGUNITID">50000013</field>
                    <field name="ORGUNITNAME">IT computer center (D)</field>
                    <field name="NUMOFGENDERCOUNT">4</field>
                    <field name="GENDER">2</field>
                </record>
                <record>
                    <field name="PARENTORGUNITID">00001001</field>
                    <field name="ORGUNITID">50000147</field>
                    <field name="ORGUNITNAME">Personnel Administration (D)</field>
                    <field name="NUMOFGENDERCOUNT">3</field>
                    <field name="GENDER">1</field>
                </record>
                <record>
                    <field name="PARENTORGUNITID">00001001</field>
                    <field name="ORGUNITID">50000013</field>
                    <field name="ORGUNITNAME">IT computer center (D)</field>
                    <field name="NUMOFGENDERCOUNT">4</field>
                    <field name="GENDER">1</field>
                </record>
            </detail>
        </section>
        <section name="myteam_ChildGenderColumnSection" link="false">
            <detail name="">
                <record>
                    <field name="PARENTORGUNITID">00001001</field>
                    <field name="ORGUNITID">50000013</field>
                    <field name="ORGUNITNAME">IT computer center (D)</field>
                    <field name="NUMOFGENDERCOUNT">4</field>
                    <field name="GENDER">2</field>
                </record>
                <record>
                    <field name="PARENTORGUNITID">00001001</field>
                    <field name="ORGUNITID">50000147</field>
                    <field name="ORGUNITNAME">Personnel Administration (D)</field>
                    <field name="NUMOFGENDERCOUNT">3</field>
                    <field name="GENDER">1</field>
                </record>
                <record>
                    <field name="PARENTORGUNITID">00001001</field>
                    <field name="ORGUNITID">50000013</field>
                    <field name="ORGUNITNAME">IT computer center (D)</field>
                    <field name="NUMOFGENDERCOUNT">4</field>
                    <field name="GENDER">1</field>
                </record>
            </detail>
        </section>
        <section name="myteam_ChildGenderColumnSection" link="false">
            <detail name="">
                <record>
                    <field name="PARENTORGUNITID">00001001</field>
                    <field name="ORGUNITID">50000013</field>
                    <field name="ORGUNITNAME">IT computer center (D)</field>
                    <field name="NUMOFGENDERCOUNT">4</field>
                    <field name="GENDER">2</field>
                </record>
                <record>
                    <field name="PARENTORGUNITID">00001001</field>
                    <field name="ORGUNITID">50000147</field>
                    <field name="ORGUNITNAME">Personnel Administration (D)</field>
                    <field name="NUMOFGENDERCOUNT">3</field>
                    <field name="GENDER">1</field>
                </record>
            </detail>
        </section>
    </sections>
</cds>

产生了想要的、正确的结果:

    var analyticsMap = {

    "AGERANGEID" : {


    "30-39" : {
    "analyticsLabel" : "Age Range",
    "analyticsName" : "30-39",

    "00001001" : {
    "analyticsOUname" : "Human Resources",
    "analyticsValue" : "1"
    },

    },


    ">=70" : {
    "analyticsLabel" : "Age Range",
    "analyticsName" : ">=70",

    "00001001" : {
    "analyticsOUname" : "Human Resources",
    "analyticsValue" : "5"
    },

    "50000013" : {
    "analyticsOUname" : "IT computer center (D)",
    "analyticsValue" : "5"
    },

    },


    "40-49" : {
    "analyticsLabel" : "Age Range",
    "analyticsName" : "40-49",

    "50000013" : {
    "analyticsOUname" : "IT computer center (D)",
    "analyticsValue" : "1"
    },

    },


    "50-59" : {
    "analyticsLabel" : "Age Range",
    "analyticsName" : "50-59",

    "50000013" : {
    "analyticsOUname" : "IT computer center (D)",
    "analyticsValue" : "2"
    },

    },

    },


    "GENDER" : {


    "2" : {
    "analyticsLabel" : "Gender",
    "analyticsName" : "female",

    "00001001" : {
    "analyticsOUname" : "Human Resources",
    "analyticsValue" : "5"
    },

    "50000013" : {
    "analyticsOUname" : "IT computer center (D)",
    "analyticsValue" : "4"
    },

    },


    "1" : {
    "analyticsLabel" : "Gender",
    "analyticsName" : "male",

    "00001001" : {
    "analyticsOUname" : "Human Resources",
    "analyticsValue" : "7"
    },

    "50000147" : {
    "analyticsOUname" : "Personnel Administration (D)",
    "analyticsValue" : "3"
    },

    "50000013" : {
    "analyticsOUname" : "IT computer center (D)",
    "analyticsValue" : "4"
    },

    },

    },


    "RACENAME" : {


    "Unknown" : {
    "analyticsLabel" : "Race",
    "analyticsName" : "Unknown",

    "00001001" : {
    "analyticsOUname" : "Human Resources",
    "analyticsValue" : "10.0"
    },

    },


    "Asian" : {
    "analyticsLabel" : "Race",
    "analyticsName" : "Asian",

    "00001001" : {
    "analyticsOUname" : "Human Resources",
    "analyticsValue" : "1"
    },

    },


    "American Indian" : {
    "analyticsLabel" : "Race",
    "analyticsName" : "American Indian",

    "00001001" : {
    "analyticsOUname" : "Human Resources",
    "analyticsValue" : "1"
    },

    },

    }

 };

关于xml - XSL 1.0 带空标签的多级分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12415829/

有关xml - XSL 1.0 带空标签的多级分组的更多相关文章

  1. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  2. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  3. ruby - 在 Ruby 中创建按公共(public)键值分组的新哈希 - 2

    假设我有一个在Ruby中看起来像这样的哈希:{:ie0=>"Hi",:ex0=>"Hey",:eg0=>"Howdy",:ie1=>"Hello",:ex1=>"Greetings",:eg1=>"Goodday"}有什么好的方法可以将它变成如下内容:{"0"=>{"ie"=>"Hi","ex"=>"Hey","eg"=>"Howdy"},"1"=>{"ie"=>"Hello","ex"=>"Greetings","eg"=>"Goodday"}} 最佳答案 您要求一个好的方法来做到这一点,所以答案是:一种您或同事可以在六个月后理解

  4. arrays - 如何在下面的示例中将两个值数组分组为 n 个值数组? - 2

    我已经有很多两个值数组,例如下面的例子ary=[[1,2],[2,3],[1,3],[4,5],[5,6],[4,7],[7,8],[4,8]]我想把它们分组到[1,2,3],[4,5],[5,6],[4,7,8]因为意思是1和2有关系,2和3有关系,1和3有关系,所以1,2,3都有关系我如何通过ruby​​库或任何算法来做到这一点? 最佳答案 这是基本Bron–Kerboschalgorithm的Ruby实现:classGraphdefinitialize(edges)@edges=edgesenddeffind_maximum_

  5. ruby - 如何将相同的相邻数字分组 - 2

    如果至少有两个相邻的数字相同,格式为,我需要打包.这是我的输入:[2,2,2,3,4,3,3,2,4,4,5]以及预期的输出:"2:3,3,4,3:2,2,4:2,5"到目前为止我试过:a=[1,1,1,2,2,3,2,3,4,4,5]a.each_cons(2).any?do|s,t|ifs==t如果相等,也许可以尝试计数器,但那是行不通的。 最佳答案 您可以使用Enumerable#chunk_while(如果你使用的是Ruby>=2.3):a.chunk_while{|a,b|a==b}.flat_map{|chunk|chu

  6. ruby-on-rails - 如何在 Rails 3 中禁用 XML 解析 - 2

    我想禁用HTTP参数的自动XML解析。但我发现命令仅适用于Rails2.x,它们都不适用于3.0:config.action_controller.param_parsers.deleteMime::XML(application.rb)ActionController::Base.param_parsers.deleteMime::XMLRails3.0中的等价物是什么? 最佳答案 根据CVE-2013-0156的最新安全公告你可以将它用于Rails3.0。3.1和3.2ActionDispatch::ParamsParser::

  7. ruby - 如何在 Ruby 中将数字分组到不同的桶中 - 2

    我有一个文件,每一行都有数字:010110101311010113114311010431420我想要一个包含每个数字出现次数的散列,在这种情况下:{0101=>2,1010=>2,1311=>2,431=>2,420=>1}我该怎么做? 最佳答案 简单的一行代码,给定一个数组items:items.inject(Hash.new(0)){|hash,item|hash[item]+=1;hash}工作原理:Hash.new(0)创建一个新的Hash,其中访问未定义的键返回0。inject(foo)使用给定的block遍历数组。对于

  8. ruby - 如何使用 Nokogiri::XML::Builder 生成动态标签? - 2

    我正在遍历数组中的一组标签名称,我想使用构建器打印每个标签名称,而不是求助于“我认为:builder=Nokogiri::XML::Builder.newdo|xml|fortagintagsxml.tag!tag,somevalendend会这样做,但它只是创建名称为“tag”的标签,并将标签变量作为元素的文本值。有人可以帮忙吗?这个看起来应该比较简单,我刚刚在搜索引擎上找不到答案。我可能没有以正确的方式提问。 最佳答案 尝试以下操作。如果我没记错的话,我添加了一个根节点,因为Nokogiri需要一个。builder=Nokogi

  9. ruby - 如何让 Nokogiri 解析并返回 XML 文档? - 2

    这是一些奇怪的例子:#!/usr/bin/rubyrequire'rubygems'require'open-uri'require'nokogiri'print"withoutread:",Nokogiri(open('http://weblog.rubyonrails.org/')).class,"\n"print"withread:",Nokogiri(open('http://weblog.rubyonrails.org/').read).class,"\n"运行此返回:withoutread:Nokogiri::XML::Documentwithread:Nokogiri::

  10. ruby - 模式加载时出现 Nokogiri::XML::Schema SyntaxError - 2

    我正在尝试加载SAML协议(protocol)架构(具体来说:https://www.oasis-open.org/committees/download.php/3407/oasis-sstc-saml-schema-protocol-1.1.xsd),但在执行此操作之后:schema=Nokogiri::XML::Schema(File.read('saml11_schema.xsd'))我得到这个输出:Nokogiri::XML::SyntaxErrorException:Element'{http://www.w3.org/2001/XMLSchema}element',att

随机推荐