XSL Traverse类似的非同类父母的孙子和更新

时间:2013-04-03 08:17:40

标签: xslt xpath

我有我的xml,这样我只想在其他子节点不为空或空值时获取标记名和segnum,当其他段为空时我不想在输出中留空。

获取我在for-each中使用的标记名,并获取我使用的segnum“count(前置:: head)+ 1”,但是我不知道如何排除空白标记

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

此致

1 个答案:

答案 0 :(得分:0)

您可以首先让模板仅匹配 head 元素,而其他子元素不是空白

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

然后,您可以通过使用 xsl:number 进行计数

来计算前面 head 元素的数量
<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>