我正在创建我的第一个xslt样式表并且发现它很困难,我已经感谢这个论坛中的一些人提供了帮助。我确实有另一个问题,希望有人可以提供帮助。
以下是我正在使用的xml的示例....
<tr layoutcode="" type="categoryhead">
<td colname="1">CatHead[~CAP]Short-term securities[#~CAP] 12.19%</td> (a)
<td colname="2"/>
<td colname="3"/>
<td colname="4"/>
</tr>
<tr layoutcode="" type="aggregated">
<td colname="1"/>
<td colname="2"><strong>Abbott Laboratories</strong><strong><sup>[Category Caption]</sup></strong><sup>0.00</sup> due 4/4/2014 - 5/28/20143</td> (b)
<td colname="3">88,300</td>
<td colname="4">88,290</td>
</tr>
我想要做的是更换文字&#34; [类别标题]&#34;在(b)行与文本&#34;短期证券&#34;来自(a)行。使用以下xslt我可以做到这一点,但我丢失了格式标记<strong>
和<sup>
。变量$ TargetReplacementToken的值为&#34; [Category Caption]&#34; .....
<xsl:template match="tr/td">
<xsl:choose>
<xsl:when test="contains(., $TargetReplacementToken)">
<!-- the td element contains the 'TargetReplacementToken' token/-->
<xsl:variable name="result" select="substring-after(substring-before((preceding::tr[@type = 'categoryhead']/td[contains(., 'CatHead')])[last()], '[#~CAP]), '[~CAP])"/>
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:copy-of select="substring-before(., $TargetReplacementToken)" />
<xsl:copy-of select="$result" />
<xsl:copy-of select="substring-after(., $TargetReplacementToken)" />
</xsl:copy>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
...这样转换的xml行看起来像这样......
<td colname="2">Abbott Laboratories Short-term securities 0.00 due 4/4/2014 - 5/28/20143</td>
有没有办法增强xslt代码来执行查找和替换文本并维护<strong>
和<sup>
,以及任何其他可能的标记?
我希望节点看起来像这样..
<td colname="2"><strong>Abbott Laboratories</strong><strong><sup> Short-term securities </sup></strong><sup>0.00</sup> due 4/4/2014 - 5/28/20143</td>
非常感谢提前。
fordprefect141
答案 0 :(得分:0)
您可以使用其他模板来匹配sup
等于text()
的所有[Category Caption]
:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="sup[text()='[Category Caption]']">
<xsl:variable name="result" select="substring-after(substring-before((preceding::tr[@type = 'categoryhead']/td[contains(., 'CatHead')])[last()], '[#~CAP]'), '[~CAP]')"/>
<xsl:element name="{name()}">
<xsl:value-of select="$result"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
<强>输出:强>
<?xml version="1.0" encoding="utf-8"?>
<table>
<tr layoutcode="" type="categoryhead">
<td colname="1">CatHead[~CAP]Short-term securities[#~CAP] 12.19%</td> (a)
<td colname="2" />
<td colname="3" />
<td colname="4" />
</tr>
<tr layoutcode="" type="aggregated">
<td colname="1" />
<td colname="2">
<strong>Abbott Laboratories</strong><strong>
<sup>Short-term securities</sup>
</strong><sup>0.00</sup> due 4/4/2014 - 5/28/20143
</td> (b)
<td colname="3">88,300</td>
<td colname="4">88,290</td>
</tr>
</table>