2015-07-21 58 views
0

我需要組基於一些屬性值和填充它。我需要組基於一些屬性值和填充它

的輸入XML是下方,並且重複的作業ID被定義爲(|)隔板。

在產生實際O/P我需要組中的作業ID,併產生重複的序列jobids數。我將如何做到這一點?

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

預期的結果:我需要組基於分部的價值觀和由於您使用XSLT 2.0填充即

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

回答

0

(問題最初是標記XSLT 2.0只),你應該能夠使用xsl:for-each-group和組由jobid|前的數...

XML輸入

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

XSLT 2.0

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

XML輸出

<employes> 
    <job> 
     <jobnbr>1</jobnbr> 
     <jobid>123</jobid> 
    </job> 
    <job> 
     <jobnbr>2</jobnbr> 
     <jobid>123</jobid> 
    </job> 
    <job> 
     <jobnbr>3</jobnbr> 
     <jobid>123</jobid> 
    </job> 
    <job> 
     <jobid>125</jobid> 
    </job> 
    <job> 
     <jobid>1010</jobid> 
    </job> 
    <job> 
     <jobid>1011</jobid> 
    </job> 
</employes> 
+0

欲XSLT 1.0也。 –