Отображать измененные элементы в выводе XSLT жирным шрифтом - PullRequest
0 голосов
/ 24 февраля 2012

Я работаю над программным обеспечением, которое разрабатывает планы полетов для эксплуатантов воздушных судов. У самолета есть датчик, который может иметь различные настройки, и эти настройки разделены на то, что мы называем «сегментами» плана полета. (Сегмент - это определенное количество времени в плане, и настройки датчика меняются только при перемещении между сегментами.)

План полета выводится в виде файла HTML, который генерируется из преобразования XSL сериализованного объекта XML через XslCompiledTransform в C # .NET. Его структура очень последовательна, так как есть ограниченное количество настроек для настройки. Для каждого сегмента выводится пара таблиц, разделенных тегами <hr />.

Что я хотел бы сделать, так это взять этот вывод и, каждый раз, когда параметр изменяется от сегмента к сегменту, выделять текст этого параметра жирным шрифтом в окончательном выводе, заключая его в теги <b>. Пример (перефразированный): ( РЕДАКТИРОВАНИЕ для уточнения )

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

Учитывая вывод XSL-преобразования, я хотел бы обернуть c в тег a или, чтобы выделить его жирным шрифтом, что приведет к чему-то вроде этого:

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

Я не уверен, писать ли вспомогательный объект в .net, использовать утилиту, запускать вывод через отдельное XSL-преобразование или как. Каков наилучший метод, если использовать имеющиеся у меня инструменты?

1 Ответ

1 голос
/ 24 февраля 2012

Это преобразование 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...