2015-07-21 80 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也。 –