Особый порядок вывода шаблона XSL

У меня есть следующий xml-файл:

<section>
  <templateId root="2.16.840.1.113883.10.20.22.2.4" />
  <text>
    <list listType="ordered">
      <item>9/18/2013 - Weight - 125 lbs</item>
      <item>9/18/2013 - Blood Pressure - 120/80 mm Hg</item>
      <item>9/18/2013 - BMI - 19 98</item>
      <item>9/11/2013 - Weight - 125 lbs</item>
      <item>9/11/2013 - Blood Pressure - 120/80 mm Hg</item>
      <item>9/11/2013 - BMI - 19 98</item>
      <item>9/11/2013 - Pulse - 32</item>
    </list>
  </text>
</section>

У меня есть следующая информация о шаблоне xsl:

<xsl:key name="vs_times" match="//hl7:section[hl7:templateId/@root='2.16.840.1.113883.10.20.22.2.4']/hl7:text/hl7:list/hl7:item" use="substring-before(., ' - ')"/>

    <xsl:template match="hl7:section[hl7:templateId/@root='2.16.840.1.113883.10.20.22.2.4']">
    <div style="padding: 5px; border-top: 1px solid #000000;">
        <span style="font-weight: bold;">Vital Signs: </span>
        <br/>
        <table border="0" cellspacing="0" cellpadding="1" width="100%">
            <xsl:apply-templates select="hl7:text/hl7:list/hl7:item[generate-id(.)=generate-id(key('vs_times', substring-before(., ' - ')))]" mode="group" />
        </table>
    </div>
</xsl:template>
<xsl:template match="hl7:item" mode="group">
    <tr>
        <td style="width: 76px;">
            <xsl:value-of select="substring-before(., ' - ')" />
        </td>
        <xsl:variable name="values" select="key('vs_times', substring-before(., ' - '))"/>
        <xsl:apply-templates select="$values" />
    </tr>
</xsl:template>
<xsl:template match="hl7:item">
    <td style="width: 180px; padding-left: 3px;">
        <xsl:apply-templates select="." mode="content" />
    </td>
</xsl:template>
<xsl:template match="hl7:item[contains(., 'Blood Pressure')]" mode="content">
    <span style="font-weight: bold;">Blood Pressure: </span>
    <xsl:value-of select="substring-before(substring-after(., 'Blood Pressure - '), ' ')"/>
</xsl:template>
<xsl:template match="hl7:item[contains(., 'Pulse')]" mode="content">
    <span style="font-weight: bold;">Pulse: </span>
    <xsl:value-of select="substring-before(substring-after(., 'Pulse - '), ' ')"/>
</xsl:template>
<xsl:template match="hl7:item[contains(., 'Weight')]" mode="content">
    <span style="font-weight: bold;">Weight: </span>
    <xsl:value-of select="substring-after(., 'Weight - ')"/>
</xsl:template>
<xsl:template match="hl7:item[contains(., 'BMI')]" mode="content">
    <span style="font-weight: bold;">BMI: </span>
    <xsl:value-of select="substring-before(substring-after(., 'BMI - '), ' ')"/>
</xsl:template>
<xsl:template match="hl7:item" mode="content">
    &#xa0;
</xsl:template>

Это выводит информацию, но мне нужно, чтобы вывод был в другом порядке (потенциально), чем элементы, которые перебираются. Мне нужно, чтобы они были в одном и том же порядке все время:

  • Артериальное давление
  • Пульс
  • Масса
  • ИМТ

На данный момент он просто перебирает каждый элемент и выводит их по мере их поступления.

Кроме того, если нет ни одного из четырех элементов (поскольку в первом наборе дат в примере нет элемента пульса), должно быть пустое место. Наконец, вторая строка должна быть другого цвета, чем первая строка.

Спасибо


person jjasper0729    schedule 04.10.2013    source источник
comment
возможный дубликат ключа xsl, не проходящего через переменные   -  person Viji    schedule 04.10.2013
comment
@Viji не дубликат .. расширение ... другой вопрос работает, и на него был дан ответ, но теперь мне нужна дополнительная помощь, чтобы элементы отображались в определенном порядке (в отличие от того, чтобы просто заставить их отображаться вообще).   -  person jjasper0729    schedule 04.10.2013


Ответы (1)


Это немного сложно, но, пожалуйста, попробуйте. Оказывается, сейчас самое время использовать choose/when, но не так, как вы планировали:

  <xsl:key name="vs_times" 
           match="hl7:section
                      [hl7:templateId/@root='2.16.840.1.113883.10.20.22.2.4']
                      /hl7:text/hl7:list/hl7:item" use="substring-before(., ' - ')"/>

  <xsl:template match="hl7:section
                         [hl7:templateId/@root='2.16.840.1.113883.10.20.22.2.4']">
    <div style="padding: 5px; border-top: 1px solid #000000;">
      <span style="font-weight: bold;">Vital Signs: </span>
      <br/>
      <table border="0" cellspacing="0" cellpadding="1" width="100%">
        <xsl:apply-templates
          select="hl7:text/hl7:list/hl7:item
                     [generate-id(.)=
                      generate-id(key('vs_times', 
                                  substring-before(., ' - ')))]"
          mode="group" />
      </table>
    </div>
  </xsl:template>
  <xsl:template match="hl7:item" mode="group">
    <tr>
      <td style="width: 76px;">
        <xsl:value-of select="substring-before(., ' - ')" />
      </td>
      <xsl:variable name="values"
                    select="key('vs_times', substring-before(., ' - '))"/>

      <xsl:call-template name="row">
        <xsl:with-param name="type" select="'Blood Pressure'" />
        <xsl:with-param name="values" select="$values" />
      </xsl:call-template>
      <xsl:call-template name="row">
        <xsl:with-param name="type" select="'Pulse'" />
        <xsl:with-param name="values" select="$values" />
      </xsl:call-template>
      <xsl:call-template name="row">
        <xsl:with-param name="type" select="'Weight'" />
        <xsl:with-param name="values" select="$values" />
      </xsl:call-template>
      <xsl:call-template name="row">
        <xsl:with-param name="type" select="'BMI'" />
        <xsl:with-param name="values" select="$values" />
      </xsl:call-template>
    </tr>
  </xsl:template>

  <xsl:template name="row">
    <xsl:param name="type" />
    <xsl:param name="values" select="/.." />

    <xsl:variable name="foundValue" select="$values[contains(., $type)]" />

    <td style="width: 180px; padding-left: 3px;">
      <xsl:if test="$type = 'Pulse' or $type = 'BMI'">
        <xsl:attribute name="class">alternate</xsl:attribute>
      </xsl:if>

      <xsl:choose>
        <xsl:when test="$foundValue">
          <span style="font-weight: bold;">
            <xsl:value-of select="concat($type, ': ')" />
          </span>
          <xsl:value-of select="substring-after($foundValue, concat($type, ' - '))"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:text>&#xa0;</xsl:text>
        </xsl:otherwise>
      </xsl:choose>
    </td>
  </xsl:template>
person JLRishe    schedule 04.10.2013
comment
Вставьте информацию, но теперь я ничего не возвращаю, как раньше (просто в неправильном порядке) - person jjasper0729; 04.10.2013
comment
@ jjasper0729 Хм. Кажется, это работает нормально для меня. Возможно, ваш XSLT-процессор не использует функцию document() так, как я использую ее выше. Какой процессор вы используете? - person JLRishe; 04.10.2013
comment
Это xslt 1.0 ‹xsl:stylesheet version=1.0 xmlns=w3.org/1999/xhtml xmlns:xsl=w3.org/1999/XSL/Transform xmlns:ms=urn :schemas-microsoft-com:xslt xmlns:xsi=w3.org/2001/ xmlns:cda=urn:hl7-org:v3 xmlns:sdtc=urn:hl7-org:sdtc › - person jjasper0729; 04.10.2013
comment
является ли функция document() функцией xslt 2.0? - person jjasper0729; 04.10.2013
comment
@ jjasper0729 Нет, это версия 1.0, но она не полностью поддерживается некоторыми процессорами XSLT. Что вы используете для выполнения XSLT? У вас есть браузер, чтобы выполнить его? - person JLRishe; 04.10.2013
comment
да, это отображается в веб-браузере как подраздел более крупной страницы asp.net (загружается в элемент управления asp.net asp:xml) - person jjasper0729; 04.10.2013
comment
Понятно, я изменил свой ответ, чтобы использовать подход, который несколько менее элегантен, но ограничен более ортодоксальными функциями. - person JLRishe; 04.10.2013
comment
Потрясающий. Оно работает. Хотя я понимаю вашу точку зрения о том, чтобы быть менее элегантным. Было бы гораздо лучше просто повторить. Мне также придется установить выбор/при установке, потому что в зависимости от типа значение может иметь весь текст после «-», а может и нет. Но это дает мне порядок, который я ищу. Спасибо за помощь - person jjasper0729; 04.10.2013
comment
Рад помочь. И в качестве последнего комментария я предлагаю использовать классы CSS в вашей разметке, а не встроенные стили. Это уменьшит дублирование в выводе и упростит обслуживание вашей страницы. - person JLRishe; 04.10.2013
comment
Я, скорее всего, вернусь назад после того, как страница будет выведена так, как она должна быть, и вытащу встроенные стили в блок стилей (у меня есть один на месте и я уже жду) - person jjasper0729; 04.10.2013