这是一个解决方案,它只是一个 XPath 表达式。
使用Kaysian 公式计算两个节点集$ns1
和的交集$ns2
:
$ns1[count(. | $ns2) = count($ns2)]
我们简单地替换$ns1
为<a>
当前<b>
节点之后的兄弟节点集,并替换为下一个节点之前的兄弟$ns2
节点集。<a>
<b>
这是一个使用 this 的完整转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="*/b"/>
</xsl:template>
<xsl:template match="b">
At: <xsl:value-of select="."/>
<xsl:variable name="vNextB" select="following-sibling::b[1]"/>
<xsl:variable name="vA-sAfterCurrentB" select="following-sibling::a"/>
<xsl:variable name="vA-sBeforeNextB" select=
"$vNextB/preceding-sibling::a
|
$vA-sAfterCurrentB[not($vNextB)]
"/>
<xsl:copy-of select=
"$vA-sAfterCurrentB
[count(.| $vA-sBeforeNextB)
=
count($vA-sBeforeNextB)
]
"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于以下 XML 文档时:
<t>
<img/>
<b>First</b>
<br />  
<img/>  
<a href="/first-href">First Href</a> - 19:30
<br />
<img/>
<b>Second</b>
<br />
<img/>  
<a href="/second-href">Second Href</a> - 19:30
<br />
<img/> 
<a href="/third-href">Third Href</a> - 19:30
<br />
</t>
产生正确的结果:
At: First <a href="/first-href">First Href</a>
At: Second <a href="/second-href">Second Href</a>
<a href="/third-href">Third Href</a>