如何使用xslt将节点(具有相同名称)合并到单个节点输出?

时间:2011-04-27 20:24:18

标签: xml xslt

我想合并节点,例如:

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

如果找到几个帖子: post 1 Post 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 个答案:

答案 0 :(得分:6)

此样式表:

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

编辑:将模板应用于内联地图的节点,以进行“复杂”的进一步处理。