这是我在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>
我做错了什么? 我事先感谢你的帮助。
答案 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']"/>