具有不同输入的重复节点

Duplicate Nodes with different input

背景信息。我正在编写一个 XSL 文件以获取分析仪器发送到服务器的 XML 并将该文件转换为我们的 LIMS 系统接受的 XML 文件。

这是一个来自仪器的简单 XML 文件:

<dataRoot>
<dataRow>
<a0>2020-05-29 10:48:09 UTC-4</a0>
<a1>MSA - Conc.(Bench)</a1>
<a2>WHC202005270038</a2>
<a3>00251832</a3>
<a4>1.15966</a4>
<a5>MSA</a5>
<a6>101.067</a6>
</dataRow>
</dataRoot>

这是我目前拥有的 XSL 文件:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0"/>

<xsl:template match="/dataRoot">

<INBOUND>
    <xsl:call-template name="A"/>
    <xsl:copy-of select="A" />
</INBOUND>

</xsl:template>

<xsl:template match="/dataRow" name="A">
    <xsl:for-each select="dataRow">
            <xsl:variable name="sSampleID" select="normalize-space(a2)" />
            <xsl:variable name="sSubmitter">AutoT_EQ00004</xsl:variable>
            <xsl:variable name="sEnteredBy">EQ00004</xsl:variable>
            <!-- Use a variable for OWNER, so that only one spot needs changing if a different value is desired -->
            <xsl:variable name="sOwner">WHC</xsl:variable>                          
                <xsl:variable name="sParameter" select="normalize-space(a5)" />                 
                <xsl:variable name="sParamName"> <!-- Parameter names mapping for import to LIMS-->
                <xsl:call-template name="ConvertPaName">
                    <xsl:with-param name="sPaName" select="$sParameter" />
                </xsl:call-template>
                </xsl:variable>                                 
                <xsl:variable name="sResult" select="normalize-space(a6)" />
                <xsl:for-each select="$sParamName">

                                <INBOX_SAMPLE>
                                    <EVENT>1</EVENT>
                                    <SAMPLE_ID><xsl:value-of select="$sSampleID"/></SAMPLE_ID>
                                    <SUBMITTER><xsl:value-of select="$sSubmitter" /></SUBMITTER>
                                    <ENTERED_BY><xsl:value-of select="$sEnteredBy" /></ENTERED_BY>
                                    <OWNER><xsl:value-of select="$sOwner" /></OWNER>
                                    <PARAMETER_NAME><xsl:value-of select="$sParamName"/></PARAMETER_NAME>
                                    <SRESULT><xsl:value-of select="$sResult"/></SRESULT>        
                                </INBOX_SAMPLE>
                </xsl:for-each>             
    </xsl:for-each>
</xsl:template>

<!-- Convert PaNames as needed, and skip processing certain values that are not actual Parameters (ie: 'Application') -->
<xsl:template name="ConvertPaName">
    <xsl:param name="sPaName" />
    <xsl:choose>
        <xsl:when test="$sPaName='MSA'">MSA - Conc.(Bench)</xsl:when>
        <xsl:when test="$sPaName='MSA'">Free MSA</xsl:when>
        <xsl:otherwise>Halt_Import</xsl:otherwise>
    </xsl:choose>
</xsl:template>
</xsl:stylesheet>

这是当前翻译的输出:

<INBOUND>
   <INBOX_SAMPLE>
      <EVENT>1</EVENT>
      <SAMPLE_ID>WHC202005270038</SAMPLE_ID>
      <SUBMITTER>AutoT_EQ00004</SUBMITTER>
      <ENTERED_BY>EQ00004</ENTERED_BY>
      <OWNER>WHC</OWNER>
      <PARAMETER_NAME>MSA - Conc.(Bench)</PARAMETER_NAME>
      <SRESULT>101.067</SRESULT>
   </INBOX_SAMPLE>
</INBOUND>

我需要做的是为两个参数名称复制此节点:

<xsl:when test="$sPaName='MSA'">MSA - Conc.(Bench)</xsl:when>
<xsl:when test="$sPaName='MSA'">Free MSA</xsl:when>

这样我的输出就变成了:

<INBOUND>
   <INBOX_SAMPLE>
      <EVENT>1</EVENT>
      <SAMPLE_ID>WHC202005270038</SAMPLE_ID>
      <SUBMITTER>AutoT_EQ00004</SUBMITTER>
      <ENTERED_BY>EQ00004</ENTERED_BY>
      <OWNER>WHC</OWNER>
      <PARAMETER_NAME>MSA - Conc.(Bench)</PARAMETER_NAME>
      <SRESULT>101.067</SRESULT>
   </INBOX_SAMPLE>
   <INBOX_SAMPLE>
      <EVENT>1</EVENT>
      <SAMPLE_ID>WHC202005270038</SAMPLE_ID>
      <SUBMITTER>AutoT_EQ00004</SUBMITTER>
      <ENTERED_BY>EQ00004</ENTERED_BY>
      <OWNER>WHC</OWNER>
      <PARAMETER_NAME>Free MSA</PARAMETER_NAME>
      <SRESULT>101.067</SRESULT>
   </INBOX_SAMPLE>
</INBOUND>

这是因为仪器发送一个参数名称,如 "MSA",但在我们的 LIMS 中,我们在 "Free MSA" 或 "MSA - Conc.(Bench)" 下有它,我需要能够提供结果两个可能的参数名称和 LIMS 都会插入它找到匹配项的那个。

非常感谢你先进:)

将参数元素添加到模板。

<xsl:template name="ConvertPaName">
    <xsl:param name="sPaName" />
    <xsl:choose>
        <xsl:when test="$sPaName='MSA'">
          <parm>MSA - Conc.(Bench)</parm>
          <parm>Free MSA</parm>
        </xsl:when>
        <xsl:otherwise>
          <parm>Halt_Import</parm>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

调用您的模板

<xsl:variable name="sParamName"> 
  <xsl:call-template name="ConvertPaName">
    <xsl:with-param name="sPaName" select="$sParameter" />
   </xsl:call-template>
</xsl:variable>

转换为节点集:(无论您如何操作。您目前没有设置 msxml 命名空间。)

<xsl:variable name="sParamNameList" select="msxml:node-set($sParamName)">

然后在 for-each 循环中使用参数列表。

<xsl:for-each select="$sParamNameList/parm">