在XSLT输出中以粗体显示更改的元素

时间:2012-02-24 17:23:54

标签: .net xslt

我正在开发一种为飞机运营商制定飞行计划的软件。飞机有一个传感器,可以调整各种设置,这些设置通过我们所说的"段"飞行计划。 (段是计划中的某段时间,传感器设置仅在段之间移动时才会更改。)

飞行计划作为HTML文件输出,该文件是通过C#.NET中的XslCompiledTransform从序列化XML对象的XSL转换生成的。它的结构非常一致,因为要调整的设置数量有限。对于每个段,输出一对表,由<hr />标记分隔。

我希望能够做的是获取该输出,并且每次设置从一个段到另一个段发生变化时,通过将其包装在{{1标签。 A(释义)示例:( EDITED for澄清

<b>

考虑到XSL转换的输出,我想在一个或标签中包装c以加粗它,结果是这样的:

<table>
  <tr>
    <td>Setting 1</td><td>a</td>
    <td>Setting 2</td><td>b</td>
  </tr>
</table>
<table>
    <tr>
    <td>Setting 3</td><td>c</td>
    </tr>
<table>

<hr />

<table>
  <tr>
    <td>Setting 1</td><td>a</td>
    <td>Setting 2</td><td>d</td>
  </tr>
</table>
<table>
    <tr>
    <td>Setting 3</td><td>c</td>
    </tr>
<table>

我不确定是否在.net中编写辅助对象,使用实用程序,通过单独的XSL转换运行输出,或者是什么。 根据我手边的工具,最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

此XSLT 1.0转换

<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=
 "table[preceding-sibling::table[2]]
    /tr
      /td[position() mod 2 = 0]
 ">
  <xsl:variable name="vPos" select="position()"/>
  <xsl:variable name="vPrevTableTD" select=
   "../../preceding-sibling::table[2]
                 /tr/td[position() = $vPos]"/>

  <td>
      <xsl:choose>
       <xsl:when test="not(. = $vPrevTableTD)">
        <b><xsl:value-of select="."/></b>
       </xsl:when>
       <xsl:otherwise>
        <xsl:value-of select="."/>
       </xsl:otherwise>
      </xsl:choose>
  </td>
 </xsl:template>
</xsl:stylesheet>

应用于以下XML文档(在制作格式良好的XML文档后提供的文档):

<html>
    <table>
        <tr>
            <td>Setting 1</td>
            <td>a</td>
            <td>Setting 2</td>
            <td>b</td>
        </tr>
    </table>
    <table>
        <tr>
            <td>Setting 3</td>
            <td>c</td>
        </tr>
    </table>
    <hr />
    <table>
        <tr>
            <td>Setting 1</td>
            <td>a</td>
            <td>Setting 2</td>
            <td>d</td>
        </tr>
    </table>
    <table>
        <tr>
            <td>Setting 3</td>
            <td>c</td>
        </tr>
    </table>
</html>

生成想要的正确结果

<html>
   <table>
      <tr>
         <td>Setting 1</td>
         <td>a</td>
         <td>Setting 2</td>
         <td>b</td>
      </tr>
   </table>
   <table>
      <tr>
         <td>Setting 3</td>
         <td>c</td>
      </tr>
   </table>
   <hr>
   <table>
      <tr>
         <td>Setting 1</td>
         <td>a</td>
         <td>Setting 2</td>
         <td><b>d</b></td>
      </tr>
   </table>
   <table>
      <tr>
         <td>Setting 3</td>
         <td>c</td>
      </tr>
   </table>
</html>