XSLT转换删除格式化标记标记

时间:2014-04-30 15:07:47

标签: xml xslt xpath

我正在创建我的第一个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

1 个答案:

答案 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>