0

我有我的 xml,因此我只想在其他子项不是空白或空值时获取标记名和 segnum,当其他段为空时,我不想在输出中保留为空白。

获取我在 for-each 中使用的标记名,并获取我使用的 segnum “count(preceding::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>

问候,

4

1 回答 1

0

您可以先使用一个模板来仅匹配其他子元素不为空白的头部元素

<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>
于 2013-04-03T12:43:01.043 回答