我想合并节点,例如:
<sourcePatientInfo>PID-3|1428eab4645a4ce^^^&1.3.6.1.4.1.21367.2008.2.1&ISO</sourcePatientInfo>
<sourcePatientInfo>PID-5|WILKINS^CHARLES^^^</sourcePatientInfo>
<sourcePatientInfo>PID-8|M</sourcePatientInfo>
对于这样的单个节点(不要担心节点值,我已经处理过了):
<sourcePatientInfo>
<patientIdentifier>
</patientIdentifier>
<patientName>
</patientName>
<patientSex></patientSex>
</sourcePatientInfo>
但是它们在源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
,这是不好的。
有任何帮助吗?谢谢!!!!
答案 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^^^&1.3.6.1.4.1.21367.2008.2.1&ISO</sourcePatientInfo>
<sourcePatientInfo>PID-5|WILKINS^CHARLES^^^</sourcePatientInfo>
<sourcePatientInfo>PID-8|M</sourcePatientInfo>
</item>
输出:
<item>
<sourcePatientInfo>
<patientIdentifier>1428eab4645a4ce^^^&1.3.6.1.4.1.21367.2008.2.1&ISO</patientIdentifier>
<patientName>WILKINS^CHARLES^^^</patientName>
<patientSex>M</patientSex>
</sourcePatientInfo>
</item>
编辑:将模板应用于内联地图的节点,以进行“复杂”的进一步处理。