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

Xslt 处理位于两个节点之间的文本,xslt,xpath,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

我有一个包含一些文本的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只选择文本节点的一部分,因此无法找到“一个a_href标记后跟一个逗号和另一个a_href标记”。 我可以检查a_href标记后面是否紧跟着另一个a_href标记,但无法检查它们之间的内容? 只有在a_href节点之间有逗号或逗号和空格时,才会出现上标。如果有更多的文本,它不应该得到上标

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

上标只有在有逗号或逗号和 a_href节点之间有一个空格

给定格式良好的(!)输入,例如:

XML

<p>Start <a href="abc"/>,<a href="def"/>, middle <a href="ghi"/>, <a href="jkl"/> and end.</p>
开始、中间和结束

以下样式表:

XSLT1.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了解不多,但我怀疑它也能处理这项任务

上标只有在有逗号或逗号和 a_href节点之间有一个空格

给定格式良好的(!)输入,例如:

XML

<p>Start <a href="abc"/>,<a href="def"/>, middle <a href="ghi"/>, <a href="jkl"/> and end.</p>
开始、中间和结束

以下样式表:

XSLT1.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了解不多,但我怀疑它也能处理这项任务

上标只有在有逗号或逗号和 a_href节点之间有一个空格

给定格式良好的(!)输入,例如:

XML

<p>Start <a href="abc"/>,<a href="def"/>, middle <a href="ghi"/>, <a href="jkl"/> and end.</p>
开始、中间和结束

以下样式表:

XSLT1.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了解不多,但我怀疑它也能处理这项任务

上标只有在有逗号或逗号和 a_href节点之间有一个空格

给定格式良好的(!)输入,例如:

XML

<p>Start <a href="abc"/>,<a href="def"/>, middle <a href="ghi"/>, <a href="jkl"/> and end.</p>
开始、中间和结束

以下样式表:

XSLT1.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了解不多,但我怀疑它也能处理这项任务

你的问题不清楚。是否只希望将分隔两个
节点的逗号标记为
,或将两个节点之间的任何文本标记为
P.S.
href
不是标签。编辑问题以澄清“将标签重命名为a_href以消除歧义”没有任何意义。这里没有歧义
href
a
元素的一个属性(任何看过HTML代码的人都知道这一点)。我指的是模糊性,即当你谈论一个a标记时很难理解的东西。恐怕你仍然没有抓住要点:你把
href
称为标记。我说
href
不是标签,你应该说
a
标签,仅此而已更重要的是:你的问题有答案吗?你的问题不清楚。是否只希望将分隔两个
节点的逗号标记为
,或将两个节点之间的任何文本标记为
P.S.
href
不是标签。编辑问题以澄清“将标签重命名为a_href以消除歧义”没有任何意义。这里没有歧义
href
a
元素的一个属性(任何看过HTML代码的人都知道这一点)。我指的是模糊性,即当你谈论一个a标记时很难理解的东西。恐怕你仍然没有抓住要点:你把
href
称为标记。我说
href
不是标签,你应该说
a
标签,仅此而已更重要的是:你的问题有答案吗?你的问题不清楚。是否只希望将分隔两个
节点的逗号标记为
,或将两个节点之间的任何文本标记为
P.S.
href
不是标签。编辑问题以澄清“将标签重命名为a_href以消除歧义”没有任何意义。这里没有歧义
href
a
元素的一个属性(任何看过HTML代码的人都知道这一点)。我指的是模糊性,即当你谈论一个a标记时很难理解的东西。恐怕你仍然没有抓住要点:你把
href
称为标记。我说
href
不是标签,你应该说
a
标签,仅此而已更重要的是:你的问题有答案吗?你的问题不清楚。您希望仅将分隔两个
节点的逗号标记为
,还是将任何文本标记为