Тестирование, если элемент XML существует в XSLT - PullRequest
1 голос
/ 29 октября 2009

Вероятно, это действительно простой ответ, но я не могу понять его жизнь.

Я хочу отображать определенное содержимое в зависимости от того, какой дочерний элемент отображается, но я не знаю, как проверить нужный элемент. Я хочу посмотреть, существуют ли элементы start, stop и note *

<xsl:template match="protocol[@id=$protocolNumber]">
<h4><xsl:value-of select="$sectionNumber"/>.<xsl:value-of select="@id"/>&nbsp;<xsl:value-of select="@title"/></h4>
<p>
     <xsl:for-each select="child::*"> 
        <xsl:choose>
            <xsl:when test="start">
                <span id="start"><xsl:value-of select="start[@level]" /></span>
            </xsl:when>
            <xsl:when test="stop">
                <span id="stop"><xsl:value-of select="stop[@level]" /></span>
            </xsl:when>
            <xsl:when test="note">
                <span id="note"><xsl:value-of select="note[@title]" />:&nbsp;<xsl:value-of select="note/text()" /></span>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="text()"/><br/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:for-each>
</p>

<protocol id="2" title="Post-Conversion Of VF / VT">
            <note title="criteria">Post-conversion treatment of VF or VT should only be started if the patient has regained a pulse of adequate rate, and has a supraventricular rhythm.  If not, refer to other cardiac protocols as appropriate.  All antiarrhythmics are  contraindicated if ventricular escape rhythm is present.</note>
            <start level="All Levels"/>
            <step>Routine medical care.</step>
            <stop level="EMT"/>
            <stop level="EMT-I"/>
            <start level="EMT-CC &amp; P"/>
            <step>
                If conversion results from defibrillation without any drug therapy:<br/><br/>
                Amiodarone (Cordarone) 150 mg IV/IO Slow IV
            </step>
            <step>If Amiodarone was the drug resulting in conversion from VF/VT, no additional antiarrhythmic is required.</step>
            <step>
                If Lidocaine (Xylocaine) was the drug resulting in conversion from VF/VT:<br/><br/>
                Repeat Lidocaine bolus 0.75 mg/kg IV/IO every 10 minutes up to a total cumulative dose of 3 mg/kg.
            </step>
            <step>If more than above listed doses are needed because of length of transport time, contact Medical Control.</step>
        </protocol>

Ответы [ 2 ]

5 голосов
/ 29 октября 2009

Внутри xsl:for-each, элемент контекста . - это текущий элемент, который вы перебираете. Когда вы пишете выражение XPath, например start, оно действительно совпадает с child::start. То, что вы хотите здесь, это self::start. Также обратите внимание, что child::* является избыточным - подойдет *.

Более идиоматический подход XSLT состоит в том, чтобы преобразовать его в отдельный набор шаблонов и позволить сопоставлению с образцом выполнять свою работу:

<xsl:template match="protocol[@id=$protocolNumber]">
  <h4><xsl:value-of select="$sectionNumber"/>.<xsl:value-of select="@id"/>&nbsp;<xsl:value-of select="@title"/></h4>
  <p>
    <!-- Applies templates to all child elements -->
    <xsl:apply-templates/>
  </p>
</xsl:template>

<xsl:template match="protocol/start">
  <span id="start"><xsl:value-of select="start/@level" /></span>
</xsl:template>

<xsl:template match="protocol/stop">
  <span id="stop"><xsl:value-of select="stop/@level" /></span>
</xsl:template>

<xsl:template match="protocol/note">
  <span id="note"><xsl:value-of select="note/@title" />:&nbsp;<xsl:value-of select="note" /></span>
</xsl:template>

<xsl:template match="protocol/*">
   <xsl:value-of select="."/>
</xsl:template>
1 голос
/ 29 октября 2009

Я не уверен, что вы пытаетесь сделать, но я вижу несколько вероятных проблем:

Во-первых, вы используете конструкцию <xsl:choose />, что означает, что если у вас есть «start», то никакие «stop» и «note» не будут обрабатываться (вы можете вместо этого использовать обычные <xsl:if /> s или какую-либо другую логику предлагает.

Во-вторых, когда вы используете start@level, я полагаю, вы действительно имеете в виду start/@level.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...