处理位于两个节点之间的文本

时间:2015-03-27 13:40:27

标签: xslt xpath

我有一个包含一些文字的XML:

<p>Sentence blah blah blah <a_href=... />,<a_href=... />,<a_href=... />.</p>

a_href标签将作为上标输出(使用设置a_href标签上标的CSS),我希望a_href元素之间的逗号也能获得上标。所以我正在寻找这个结果的转换:

<p>Sentence blah blah blah <a_href... /><sup>,</sup><a_href... /><sup>,</sup><a_href... />.</p>

我不认为我可以使用Xpath只选择部分文本节点,因此无法找到&#34; a_href标记后跟逗号和另一个a_href标记&#34 ;。 我可以检查一个a_href标签后面跟着另一个a_href标签,但是不能检查它们之间的区别? 只有在a_href节点之间有逗号或逗号和一个空格时才会出现上标。如果有更多的文字,它不应该得到一个上标。

(编辑:将标签重命名为a_href以消除歧义,在实际代码中缺少下划线)

1 个答案:

答案 0 :(得分:3)

  

只有在有逗号或逗号时才会出现上标   a_href节点之间的一个空格。

给出一个格式良好的(!)输入,例如:

<强> XML

<p>Start <a href="abc"/>,<a href="def"/>, middle <a href="ghi"/>, <a href="jkl"/> and end.</p>

以下样式表:

XSLT 1.0

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

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

<xsl:template match="text()[normalize-space(.)=',' and preceding-sibling::*[1][self::a] and following-sibling::*[1][self::a]]">
    <sup>
        <xsl:value-of select="."/>
    </sup>
</xsl:template>

</xsl:stylesheet>

将返回:

<?xml version="1.0" encoding="UTF-8"?>
<p>Start <a href="abc"/>
   <sup>,</sup>
   <a href="def"/>, middle <a href="ghi"/>
   <sup>, </sup>
   <a href="jkl"/> and end.</p>

注意

你说a标签被CSS设为上标样式;我对CSS知之甚少,但我怀疑它也可以处理这个任务。