我需要根据某个属性对值进行分组并填充它

时间:2015-07-21 14:46:12

标签: xslt-1.0

我需要根据某个属性对值进行分组并填充它。

输入XML在下面,重复的jobid被定义为(|)分隔符。

在生成实际的o / p时,我需要按jobid进行分组,并为重复的jobid生成序列号。我该怎么做?

  <employes>
    <job>
        <jobid>125</jobid>
    </job>
    <job>
        <jobid>1011</jobid>
    </job>
    <job>
        <jobid>123|1</jobid>
    </job>
    <job>
        <jobid>123|2</jobid>
    </job>
    <job>
        <jobid>1010</jobid>
    </job>
    <job>
        <jobid>123|1</jobid>
    </job>
</employes>

预期结果:我需要根据Division进行分组并填充,即

<employes>
    <job>
        <jobnum>1</jobnum>
        <jobid>123</jobid>
    </job>
    <job>
        <jobnum>2</jobnum>
        <jobid>123</jobid>
    </job>
    <job>
        <jobnum>3</jobnum>
        <jobid>123</jobid>
    </job>  
    <job>
        <jobid>125</jobid>
    </job>
    <job>
        <jobid>1010</jobid>
    </job>  
    <job>
        <jobid>1011</jobid>
    </job>
</employes>

1 个答案:

答案 0 :(得分:0)

由于您正在使用XSLT 2.0(问题最初仅标记为XSLT 2.0),您应该能够使用#!/bin/bash read -p "Enter username: " username read -p "Enter groups: " groups for g in ${groups//,/ }; do grep -q "^$g:" /etc/group ret=$? # save returncode of grep if [[ $ret -eq 0 ]]; then usermod -aG "$g" "$username" else echo "Group $g does not exists" fi done 并按xsl:for-each-group|之前的数字分组...

XML输入

jobid

XSLT 2.0

<employes>
    <job>
        <jobid>125</jobid>
    </job>
    <job>
        <jobid>1011</jobid>
    </job>
    <job>
        <jobid>123|1</jobid>
    </job>
    <job>
        <jobid>123|2</jobid>
    </job>
    <job>
        <jobid>1010</jobid>
    </job>
    <job>
        <jobid>123|1</jobid>
    </job>
</employes>

XML输出

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/*">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:for-each-group select="job" group-by="substring-before(concat(jobid,'|'),'|')">
                <xsl:sort select="substring-before(concat(jobid,'|'),'|')" data-type="number" order="ascending"/>
                <xsl:apply-templates select="current-group()"/>
            </xsl:for-each-group>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="job[contains(jobid,'|')]">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()[not(self::jobid)]"/>
            <jobnbr><xsl:value-of select="position()"/></jobnbr>
            <jobid><xsl:value-of select="substring-before(jobid,'|')"/></jobid>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>