Как объединить узлы (с тем же именем) в один узел вывода с помощью xslt? - PullRequest
2 голосов
/ 28 апреля 2011

Я хотел бы объединить узлы, такие как:

<sourcePatientInfo>PID-3|1428eab4645a4ce^^^&amp;1.3.6.1.4.1.21367.2008.2.1&amp;ISO</sourcePatientInfo>
<sourcePatientInfo>PID-5|WILKINS^CHARLES^^^</sourcePatientInfo>
<sourcePatientInfo>PID-8|M</sourcePatientInfo>

Для одного узла, подобного этому (не беспокойтесь о значении узла, оно у меня обрабатывается):

   <sourcePatientInfo>
      <patientIdentifier>
      </patientIdentifier>
      <patientName>
      </patientName>
      <patientSex></patientSex>
   </sourcePatientInfo>

Если найдено несколько постов: сообщение 1 Пост 2

Но они объединяют узлы с разными именами в исходном XML. На данный момент у меня есть это:

<xsl:template match="sourcePatientInfo">
    <sourcePatientInfo>
        <xsl:choose>
            <xsl:when test="matches(., 'PID-3')">
            <patientIdentifier />
            </xsl:when>
            <xsl:when test="matches(., 'PID-5')">
            <patientName />
            </xsl:when>
            <xsl:when test="matches(., 'PID-8')">
            <patientSex />
            </xsl:when>                 
        </xsl:choose>
    </sourcePatientInfo>
</xsl:template>

Я исключил некоторые детали, чтобы избежать большого количества кода. Я получаю 3 отдельных sourcePatientInfo, которые не годятся.

Любая помощь? Спасибо !!!!

1 Ответ

6 голосов
/ 28 апреля 2011

Эта таблица стилей:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:l="http://localhost"
 exclude-result-prefixes="l">
    <l:n id="PID-3">patientIdentifier</l:n>
    <l:n id="PID-5">patientName</l:n>
    <l:n id="PID-8">patientSex</l:n>
    <xsl:variable name="vNames" select="document('')/*/l:n"/>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="sourcePatientInfo"/>
    <xsl:template match="sourcePatientInfo[1]">
        <xsl:copy>
            <xsl:apply-templates
             select=".|following-sibling::sourcePatientInfo"
             mode="merge"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="sourcePatientInfo" mode="merge">
        <xsl:apply-templates 
             select="$vNames[@id=substring-before(current(),'|')]">
            <xsl:with-param name="pCurrent" select="."/>
        </xsl:apply-templates>
    </xsl:template>
    <xsl:template match="l:n">
        <xsl:param name="pCurrent" select="/.."/>
        <xsl:element name="{.}">
            <xsl:value-of select="substring-after($pCurrent,'|')"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

С этим входом:

<item>
    <sourcePatientInfo>PID-3|1428eab4645a4ce^^^&amp;1.3.6.1.4.1.21367.2008.2.1&amp;ISO</sourcePatientInfo>
    <sourcePatientInfo>PID-5|WILKINS^CHARLES^^^</sourcePatientInfo>
    <sourcePatientInfo>PID-8|M</sourcePatientInfo>
</item>

Вывод:

<item>
    <sourcePatientInfo>
        <patientIdentifier>1428eab4645a4ce^^^&amp;1.3.6.1.4.1.21367.2008.2.1&amp;ISO</patientIdentifier>
        <patientName>WILKINS^CHARLES^^^</patientName>
        <patientSex>M</patientSex>
    </sourcePatientInfo>
</item>

РЕДАКТИРОВАНИЕ : применение шаблонов кузлы встроенной карты для «сложной» дальнейшей обработки.

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