2013-10-04 2 views
0

Я получил следующий XML:ключ XSL не проходя через переменные

<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> 
    </list> 
    </text> 
</section> 

Мне нужно, чтобы иметь выход HTML появляются в следующем виде:

<table> 
    <tr> 
    <td>9/18/2013</td> 
    <td>Blood Pressure - 120/80</td> 
    <td>Weight - 125lbs</td> 
    <td>BMI - 19</td> 
    </tr> 
</table> 

Я следующий ключ настройки в моем файле 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(., ' - ')"/> 

Это чтобы получить дату. В моем xml МОЖЕТ быть более одного набора дат (но не более двух), а второй параметр даты будет другой строкой в ​​приведенном выше примере таблицы.

Это моя XSL информация шаблона для вывода:

<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;"> 
    <table border="0" cellspacing="0" cellpadding="1" width="100%"> 
     <xsl:for-each select="hl7:text/hl7:list/hl7:item[generate-id(.)=generate-id(key('vs_times', substring-before(., ' - ')))]"> 
     <tr> 
      <td style="width: 76px;"> 
      <xsl:value-of select="substring-before(., ' - ')" /> 
      </td> 
      <xsl:variable name="values" select="key('vs_times', substring-after(., ' - '))"/> 
      <td style="width: 180px; padding-left: 3px;"> 
      <xsl:choose> 
       <xsl:when test="substring-before($values, ' - ') = 'Blood Pressure'"> 
       <span style="font-weight: bold;">Blood Pressure: </span> 
       <xsl:value-of select="substring-after($values, ' - ')"/> 
       </xsl:when> 
       <xsl:otherwise> 
       &#xa0; 
       </xsl:otherwise> 
      </xsl:choose> 
      </td> 
     </tr> 
     </xsl:for-each> 
    </table> 
    </div> 
</xsl:template> 

(это только фрагмент, если я могу получить сот один стола, чтобы показать для кровяного давления, то я могу дублировать для. другие элементы списка). Проблема, с которой я сталкиваюсь, заключается в том, что дата появляется без проблем. Однако следующая ячейка таблицы не отображается. Я не знаю, ссылаюсь ли я на свой ключ, или если я ссылаюсь на значение, чтобы показать неправильное.

Благодаря

ответ

1

Похоже, у вас есть substring-after, где вы должны иметь substring-before:

<xsl:variable name="values" select="key('vs_times', substring-after(., ' - '))"/> 

должно быть:

<xsl:variable name="values" select="key('vs_times', substring-before(., ' - '))"/> 

И это должно иметь substring-after:

<xsl:when test="substring-before($values, ' - ') = 'Blood Pressure'"> 

Кроме того, вам нужно будет перебирать элементы в $values (желательно с шаблонами, а не for-each), но похоже, что вы уже знаете это. Что-то вроде этого:

<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;"> 
     <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-after(., 'Blood Pressure - ')"/> 
    </xsl:template> 

    <xsl:template match="hl7:item" mode="content"> 
    &#xa0; 
    </xsl:template> 
+0

Единственная проблема со вторым шаблоном заключается в том, что форматирование должно быть различным для каждого элемента в списке. Я изучил это, но было бы больше выбрать/когда во втором шаблоне было просто проще для меня сделать это в первом. Я могу сделать попытку с этим, хотя. – jjasper0729

+0

@ jjasper0729 Существует почти никогда не веская причина использовать 'выбирать/когда' вместо шаблонов, особенно в такой ситуации. Если вы хотите открыть отдельный вопрос о том, как правильно форматировать в элегантной манере, я был бы более чем счастлив помочь. – JLRishe

+0

Думаю, я могу открыть вторую. Это отлично работает, но мне нужны элементы в определенном порядке, которые могут отличаться от порядка, в котором они выполняются (например, xml имеет вес, затем артериальное давление, затем bmi, но выход должен быть bp, weight, bmi) , Кроме того, если нет ни одного из них, в нем должно быть пустое пространство, которое должно быть записано на выходе – jjasper0729

Смежные вопросы