2017-01-12 14 views
0

У меня есть вход следующим образом:Как получить номера строк для элементов XML, используя XSLT в множественном комплексе и повторяющихся левах?

<root> 
    <image> 
     <imag1 ></imag1> 
     <imag1 ></imag1> 
     <imag2 ></imag2> 
    <imageLink> 
     <url colNumber="1">aa</url> 
     <imageTypeCode colNumber="2">PRODUCT_IMAGE</imageTypeCode> 
     <languageCode colNumber="3">en</languageCode> 
     <languageCode colNumber="3">fr</languageCode> 
    </imageLink> 
    <imageLink> 
     <url colNumber="1">bb</url> 
     <imageTypeCode colNumber="2">PRODUCT_IMAGE</imageTypeCode> 
     <languageCode colNumber="3">fr</languageCode> 
     <commTest> 
      <languageCode colNumber="4">fssdr</languageCode> 
      <languageCode colNumber="4">fr</languageCode> 
      <dummy colNumber="5">DDDUMM</dummy> 
     </commTest> 
     <commTest> 
      <languageCode colNumber="4">fd777r</languageCode> 
      <languageCode colNumber="4">fr777</languageCode> 
      <dummy colNumber="5">DDD777UMM</dummy> 
     </commTest> 
    </imageLink> 
    <changedName> 
      <languageCode colNumber="4">fd777r</languageCode> 
      <languageCode colNumber="4">fr777</languageCode> 
      <dummy colNumber="5">DDD777UMM</dummy> 
     </changedName> 
     <changedName> 
      <languageCode colNumber="4">fd777r</languageCode> 
      <languageCode colNumber="4">fr777</languageCode> 
      <dummy colNumber="5">DDD777UMM</dummy> 
     </changedName> 
    </image> 
</root> 

И мой выход требуется выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<image rowNum="1"> 
    <imag1 rowNum="1"/> 
    <imag1 rowNum="2"/> 
    <imag2 rowNum="1"/> 
    <imageLink rowNum="1"> 
     <url rowNum="1" colNumber="1">aa</url> 
     <imageTypeCode rowNum="1" colNumber="2">PRODUCT_IMAGE</imageTypeCode> 
     <languageCode rowNum="1" colNumber="3">en</languageCode> 
     <languageCode rowNum="2" colNumber="3">fr</languageCode> 
    </imageLink> 
    <imageLink rowNum="3"> 
     <url rowNum="3" colNumber="1">bb</url> 
     <imageTypeCode rowNum="3" colNumber="2">PRODUCT_IMAGE</imageTypeCode> 
     <languageCode rowNum="3" colNumber="3">fr</languageCode> 
     <commTest rowNum="3"> 
     <languageCode rowNum="3" colNumber="4">fssdr</languageCode> 
     <languageCode rowNum="4" colNumber="4">fr</languageCode> 
     <dummy rowNum="3" colNumber="5">DDDUMM</dummy> 
     </commTest> 
     <commTest rowNum="5"> 
     <languageCode rowNum="5" colNumber="4">fd777r</languageCode> 
     <languageCode rowNum="6" colNumber="4">fr777</languageCode> 
     <dummy rowNum="5" colNumber="5">DDD777UMM</dummy> 
     </commTest> 
    </imageLink> 
    <changedName rowNum="1"> 
     <languageCode rowNum="1" colNumber="4">fd777r</languageCode> 
     <languageCode rowNum="2" colNumber="4">fr777</languageCode> 
     <dummy rowNum="1" colNumber="5">DDD777UMM</dummy> 
    </changedName> 
    <changedName rowNum="3"> 
     <languageCode rowNum="3" colNumber="4">fd777r</languageCode> 
     <languageCode rowNum="4" colNumber="4">fr777</languageCode> 
     <dummy rowNum="3" colNumber="5">DDD777UMM</dummy> 
    </changedName> 
</image> 

этот процесс происходит в несколько уровней сложности элементов, эти номера строк назначаются так, что он входит в лист пресса в виде рядов и колонн

может ли кто-нибудь помочь мне?

+0

Вы пробовали? Какова логика назначения «rowNum»? – Rao

+0

Опубликуйте свой XSLT! – Utkanos

+0

Возможный дубликат [Как получить номера строк для элементов XML, используя XSLT?] (Http://stackoverflow.com/questions/41606461/how-to-get-row-numbers-for-elements-of-xml- using-xslt) –

ответ

0

Попробуйте следующий XSLT, на основе нумерации в любой режим:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output encoding="UTF-8" indent="yes" /> 
    <xsl:strip-space elements="*"/> 

    <!-- To omit root node --> 
    <xsl:template match="root"> 
     <xsl:apply-templates select="image"/> 
    </xsl:template> 

    <!-- All other elements --> 
    <xsl:template match="*"> 
     <!-- Depth level --> 
     <xsl:variable name="lvl" select="count(ancestor::*) - 1"/> 
     <!-- Name of the current node --> 
     <xsl:variable name="currName" select="name()"/> 
     <!-- Name of the ancestor for numeration --> 
     <xsl:variable name="ancName"> 
      <!-- Children of image - just 'image' --> 
      <xsl:if test="$lvl &lt;= 1"> 
       <xsl:value-of select="'image'"/> 
      </xsl:if> 
      <!-- "Deeper" descendants - one level deeper --> 
      <xsl:if test="$lvl &gt; 1"> 
       <xsl:value-of select="ancestor::*[$lvl - 1]/name()"/> 
      </xsl:if> 
     </xsl:variable> 
     <!-- Create element with current name --> 
     <xsl:element name="{$currName}"> 
      <!-- Set rowNum --> 
      <xsl:attribute name="rowNum"> 
       <xsl:number level="any" from="*[name()=$ancName]"/> 
      </xsl:attribute> 
      <!-- Process inner content --> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:element> 
    </xsl:template> 

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

Нумерацию является немного diffrent от вашего образца, но:

  1. Ваш требуется выходной образец I см., что прямые дети image с таким же именем получают последовательные номера во всем выходе.

  2. Как указано в комментариях, начиная с всяким разом, когда есть изменение ..., RowNum с для всех потомков прямых детей изображения должны получить число от 1 (отдельного подсчета внутри групп узлов с то же имя).