2013-04-03 67 views
0

我有我的xml,這樣我只想在其他子項不爲空或空值時,其他分段爲空的情況下獲得標記名和segnum我不想在輸出中保留空白。XSL遍歷非相似父母的相似孫子,並更新

讓我使用中的換每個標記名,並獲得我公司採用「計數(前::頭)+ 1」的segnum,但是我不知道如何排除空白標籤

<myxml> 
    <a> 
    <head> 
     <tagname></tagname> 
     <segnum></segnum> 
    </head> 
    <fs>axl</fs> 
    <es>hoot</es> 
    </a> 
    <b> 
    <head> 
     <tagname></tagname> 
     <segnum></segnum> 
    </head> 
    <zz>suger</zz> 
    <sd>mint</sd> 
    </b> 
    <b> 
    <head> 
     <tagname></tagname> 
    </head> 
    <zz></zz> 
    <sd></sd> 
    <gs></gs> 
    </b> 
    <g> 
    <head> 
     <tagname></tagname> 
     <segnum></segnum> 
    </head> 
    <gz></gz> 
    <gd></gd> 
    <gs></gs> 
    </g> 
</myxml> 

required output: 

<myxml> 
    <a> 
    <head> 
     <tagname>a</tagname> 
     <segnum>1</segnum> 
    </head> 
    <fs>axl</fs> 
    <es>hoot</es> 
    </a> 
    <b> 
    <head> 
     <tagname>b</tagname> 
     <segnum>2</segnum> 
    </head> 
    <zz>suger</zz> 
    <sd>mint</sd> 
    </b> 
    <b> 
    <head> 
     <tagname></tagname> 
     <segnum></segnum> 
    </head> 
    <zz></zz> 
    <sd></sd> 
    <gs></gs> 
    </b> 
    <g> 
    <head> 
     <tagname></tagname> 
     <segnum></segnum> 
    </head> 
    <gz></gz> 
    <gd></gd> 
    <gs></gs> 
    </g> 
</myxml> 

問候,

+0

兩個問題,以澄清:(一)XSLT 1.0或2.0,(b)中,當一個元件具有非空的兒童,是基於所有分段或segnum只有非空白的?換句話說,如果在你的例子末尾的空白段之後還有另一個非空白段,它應該被編號爲5或3? –

回答

0

您可以通過具有模板開始只匹配元素,其中其他孩子不爲空

<xsl:template match="head[following-sibling::*/text()]"> 

然後你就可以通過利用XSL獲得前元素數量的計數:數量做計數

<xsl:variable name="count"> 
    <xsl:number count="head[following-sibling::*/text()]" level="any" /> 
</xsl:variable> 

然後你可以輸出這個在您的標記名元素,像這樣:

<tagname><xsl:number value="$count" format="a" /></tagname> 

以下是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="head[following-sibling::*/text()]"> 
     <xsl:variable name="count"> 
     <xsl:number count="head[following-sibling::*/text()]" level="any" /> 
     </xsl:variable> 
     <head> 
     <tagname><xsl:number value="$count" format="a" /></tagname> 
     <segnum><xsl:number value="$count" /></segnum> 
     </head> 
    </xsl:template> 

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

當施加到您的XML,下面是輸出

<myxml> 
    <a> 
    <head> 
     <tagname>a</tagname> 
     <segnum>1</segnum> 
    </head> 
    <fs>axl</fs> 
    <es>hoot</es> 
    </a> 
    <b> 
    <head> 
     <tagname>b</tagname> 
     <segnum>2</segnum> 
    </head> 
    <zz>suger</zz> 
    <sd>mint</sd> 
    </b> 
    <b> 
    <head> 
     <tagname/> 
    </head> 
    <zz/> 
    <sd/> 
    <gs/> 
    </b> 
    <g> 
    <head> 
     <tagname/> 
     <segnum/> 
    </head> 
    <gz/> 
    <gd/> 
    <gs/> 
    </g> 
</myxml>