当前接受的解决方案是不正确的,通常会产生不正确的结果。例如,当应用于此 XML 文件时:
<ol class="ast">
<li><a href="#">with a link.</a>*<span class="tab">Some blabla </span></li>
<li>Something else</li>
</ol>
产生了这个不正确的结果(span
并且文本被错误地删除):
<?xml version="1.0" encoding="UTF-8"?><ol class="ast">
<li><a href="#">with a link.</a></li>
<li>Something else</li>
</ol>
这是一个正确的解决方案:
<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()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"li/node()[1]
[self::text() and not(translate(.,'*',''))
and following-sibling::node()[self::span[@class='tab']]
]"/>
<xsl:template match=
"li/node()[2]
[self::span[@class='tab']
and preceding-sibling::node()[1]
[self::text() and not(translate(.,'*',''))]
]
"/>
</xsl:stylesheet>
应用于提供的 XML 文档时:
<ol class="ast">
<li>*<span class="tab"><!--tab--></span>Some blabla <a href="#">with a link.</a></li>
<li>Not asterisks!<span class="tab"><!--tab--></span>Some other blabla, this one without other elements</li>
<li>**<span class="tab"><!--tab--></span>Some other blabla, this one without other elements</li>
<li>***<span>hello</span>Some other blabla, this one without other elements</li>
</ol>
这种转换产生了想要的、正确的结果:
<ol class="ast">
<li>*<span class="tab"><!--tab--></span>Some blabla <a href="#">with a link.</a></li>
<li>Not asterisks!<span class="tab"><!--tab--></span>Some other blabla, this one without other elements</li>
<li>**<span class="tab"><!--tab--></span>Some other blabla, this one without other elements</li>
<li>***<span>hello</span>Some other blabla, this one without other elements</li>
</ol>
当应用于上面的第一个 XML 文档时:
<ol class="ast">
<li><a href="#">with a link.</a>*<span class="tab">Some blabla </span>
</li>
<li>Something else</li>
</ol>
再次产生正确的结果:
<ol class="ast">
<li>
<a href="#">with a link.</a>*<span class="tab">Some blabla </span>
</li>
<li>Something else</li>
</ol>