0

鉴于这样的事情:

<source>
 <somestuff>
  <thead>
   <row>C1</row>
  </thead>
  <tbody>
  <row>C2</row>
  <row>C3</row>
  </tbody>
 </somestuff>
 <somestuff>
  <tbody>
   <row>C4</row>
   <row>C5</row>
  </tbody>
 </somestuff>
 <somestuff>
  <tbody>
   <row>C6</row>
   <row>C7</row>
  </tbody>
 </somestuff>
</source>

我需要将 thead 元素的内容作为第一个子元素复制到以下 tbody 元素。(可能有任意数量的 thead 元素。)导致:

<source>
 <somestuff>
  <tbody>
  <row>C1</row>
  <row>C2</row>
  <row>C3</row>
  </tbody>
 </somestuff>
 <somestuff>
  <tbody>
   <row>C4</row>
   <row>C5</row>
  </tbody>
 </somestuff>
 <somestuff>
  <tbody>
   <row>C6</row>
   <row>C7</row>
  </tbody>
 </somestuff>
</source>

我试过这个

 <xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

<xsl:template match="tbody/*[1]">
 <xsl:copy-of select=
     "preceding-sibling::*[1]
                      [name()='thead']/row"/>
<xsl:call-template name="identity"/>
 </xsl:template>


<!-- deleting the Head node  -->
 <xsl:template match="//thead"/>
</xsl:stylesheet>

但失败了。谢谢你。拉尔夫

4

1 回答 1

1

试试这个:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="tbody/*[1]">
  <xsl:apply-templates select="../preceding-sibling::thead[1]/node()" />
  <xsl:call-template name="identity" />
 </xsl:template>

 <!-- deleting the Head node  -->
 <xsl:template match="thead"/>
</xsl:stylesheet>

原始样式表的关键问题是您试图选择

preceding-sibling::*[1][name()='thead']

当上下文节点是 的节点时tbody,不是tbody它自己。我的版本在寻找它之前添加..了一个。tbodypreceding-sibling::thead[1]

请注意,这不包括您有空tbodythead没有以下内容的情况tbody。为了捕捉这些情况,您最好将模板thead改为

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <!-- ignore a tbody that immediately follows a thead -->
 <xsl:template match="tbody[preceding-sibling::*[1]/self::thead]"/>

 <xsl:template match="thead">
  <tbody>
   <xsl:apply-templates select="@*|node()" />
   <xsl:apply-templates select="following-sibling::*[1]/self::tbody/node()" />
  </tbody>
 </xsl:template>
</xsl:stylesheet>

这会在您的原始 XML 上产生相同的结果,但也可以处理诸如

 <somestuff>
  <thead>
   <row>C9</row>
  </thead>
 </somestuff>

或者

 <somestuff>
  <thead>
   <row>C9</row>
  </thead>
  <tbody>
  </tbody>
 </somestuff>
于 2013-02-12T16:34:44.447 回答