2017-01-12 35 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> 

這個過程發生在元素複雜多層次,這些行數進行分配,這樣,它進入成行列形式的Excel表格

任何人都可以請我協助?

+0

你有沒有試過?分配'rowNum'的邏輯是什麼? – Rao

+0

發佈您的XSLT! – Utkanos

+0

[如何使用XSLT獲取XML元素的行號?](http://stackoverflow.com/questions/41606461/how-to-get-row-numbers-for-elements-of-xml-使用-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> 

項的編號是從您的樣品有點不同勢,但:

  1. 在您需要的輸出樣本I看到的直接子女圖像 同名得到整個輸出中的連續數字。

  2. 當您在評論表示與節點的組內開始每當有變化...的rowNum S代表形象應該得到的數字的直接子項的所有後代從1(單獨計數一樣的名字)。