xslt在兄弟节点第2部分内移动节点

时间:2016-02-20 14:21:38

标签: xslt

这是我在xslt move node inside sibling node

上发布的内容的进一步问题

这是我的意见:

self.dataArray

这是我想要的输出:

<div class="a" >aaa
  <div class="b">b1</div>
  <div class="c">b1c1</div>
  <div class="d">b1d1</div>
  <div class="d">b1d2</div>
  <div class="b">b2</div>
  <div class="c">b2c1</div>
  <div class="d">b2d1</div>
  <div class="d">b2d2</div>
  <div class="d">b2d3</div>
  <div class="b">b3</div>
  <div class="c">b3c1</div>
  <div class="d">b3d1</div>
</div>

与上一个问题的唯一区别是有一个值,即aaa。

我正在使用以下xslt:

<div class="a" >aaa
  <div class="b">b1
    <div class="c">b1c1</div>
    <div class="d">b1d1</div>
    <div class="d">b1d2</div>
  </div>
  <div class="b">b2
    <div class="c">b2c1</div>
    <div class="d">b2d1</div>
    <div class="d">b2d2</div>
    <div class="d">b2d3</div>
  </div>
  <div class="b">b3
    <div class="c">b3c1</div>
    <div class="d">b3d1</div>
  </div>
</div>

但它给了我以下结果,即“aaa”(在div class =“a”之后)消失了:(

<?xml version="1.0"?>
<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:key name="b" match="div[@class!='b']" use="generate-id(preceding-sibling::div[@class='b'][1])" />

 <!-- Identity template, copies everything as is -->
 <xsl:template match="@*|node()">
  <xsl:copy>
   <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
 </xsl:template>

 <!-- Override for target element -->
 <xsl:template match="div[@class='a']">
  <xsl:copy>
   <xsl:apply-templates select="@*|div[@class='b']"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="div[@class='b']">
  <xsl:copy>
   <xsl:apply-templates select="@*|node()" />
   <xsl:apply-templates select="key('b', generate-id())" />
  </xsl:copy>
 </xsl:template>

</xsl:stylesheet>

我做错了什么? 我事先感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

问题在于此行,在匹配"div[@class='a']"

的模板中
<xsl:apply-templates select="@*|div[@class='b']"/>

这个选择属性,div和类“b”,但它不选择任何其他东西,包括文本节点。将其替换为选择“aaa”文本

<xsl:apply-templates select="@*|text()|div[@class='b']"/>

或者,这也可行

<xsl:apply-templates select="@*|node() except div[@class !='b']"/>