如何在内存中合并XML个文件?
How to merge in memory XML documents?
我有2批文件。在第 1 批中,我需要在其 SPID 等于 characteristic/score/SPID 时合并 pit/score。预期的合并看起来像第 2 批文档,characteristic/score/default 是 pit/score
的合并内容。如果文档已经有 characteristic/score/default
则保持原样。
Batch 1:
<creditRisk>
<characteristic>
<score>
<LID>C123</LID>
<SPID>106123</SPID>
<Sector>Real Estate, Rental and Leasing</Sector>
</score>
<score>
<LID>C470</LID>
<SPID>127999</SPID>
<Sector>Professional, Scientific and Technical Services</Sector>
</score>
</characteristic>
<pit>
<score>
<LID>C123</LID>
<SPID>106123</SPID>
<LTV>0.8654782868</LTV>
<LGD>0.099571924</LGD>
<Logarithm>-0.104884989</Logarithm>
</score>
<score>
<LID>C470</LID>
<SPID>127999</SPID>
<LTV>0.1950292239</LTV>
<LGD>0.4296130401</LGD>
<Logarithm>-0.561440272</Logarithm>
</score>
</pit>
</creditRisk>
Btach 2:
<creditRisk>
<characteristic>
<score>
<default>
<LID>C307</LID>
<SPID>363553</SPID>
<LTV>1.031735135</LTV>
<LGD>0.4421581764</LGD>
<Logarithm>-0.583679827</Logarithm>
</default>
<LID>C307</LID>
<SPID>363553</SPID>
<Sector>Manufacturing and Consumer Products</Sector>
</score>
<score>
<default>
<LID>C357</LID>
<SPID>329924</SPID>
<LTV>0.8326657196</LTV>
<LGD>0.1983093536</LGD>
<Logarithm>-0.221032473</Logarithm>
</default>
<LID>C357</LID>
<SPID>329924</SPID>
<Sector>Utilities, Construction and Other Infrastructure</Sector>
</score>
</characteristic>
</creditRisk>
预期输出:
第 1 批:
<characteristic>
<score>
<default>
<LID>C123</LID>
<SPID>106123</SPID>
<LTV>0.8654782868</LTV>
<LGD>0.099571924</LGD>
<Logarithm>-0.104884989</Logarithm>
</default>
<LID>C123</LID>
<SPID>106123</SPID>
<Sector>Real Estate, Rental and Leasing</Sector>
</score>
<score>
<default>
<LID>C470</LID>
<SPID>127999</SPID>
<LTV>0.1950292239</LTV>
<Recovery>0.5703869599</Recovery>
<LGD>0.4296130401</LGD>
<Logarithm>-0.561440272</Logarithm>
</default>
<LID>C470</LID>
<SPID>127999</SPID>
<Sector>Professional, Scientific and Technical Services</Sector>
</score>
</characteristic>
我的 xsl1 没有合并任何东西,只是清除了所有 pit
元素。
<xsl:template match="creditRisk">
<characteristic>
<xsl:for-each select="characteristic/score">
<score>
<default>
<xsl:for-each select="pit/score[SPID eq ./SPID]">
<xsl:copy-of select="./*"/>
</xsl:for-each>
</default>
<xsl:copy-of select="./*"/>
</score>
</xsl:for-each>
</characteristic>
</xsl:template>
我的 xsl2 因错误而失败:
不允许将超过一项的序列作为 'eq' (, , , ...)
的第二个操作数
<xsl:template match="creditRisk">
<characteristic>
<xsl:variable name="character" select="characteristic/score"/>
<xsl:variable name="pit" select="pit/score"/>
<xsl:choose>
<xsl:when test="fn:exists($pit)">
<xsl:for-each select="$character">
<score>
<default>
<xsl:for-each select="$pit[SPID eq $character/SPID]">
<xsl:copy-of select="./*"/>
</xsl:for-each>
</default>
<xsl:copy-of select="$character/*"/>
</score>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="."/>
</xsl:otherwise>
</xsl:choose>
</characteristic>
</xsl:template>
我怎样才能让我的 xsl 工作?由于依赖关系,我无法在 xsl 中使用 。如果是BaseX,那就是独立的。
XSLT 2
<xsl:template match="creditRisk[pit]">
<characteristic>
<xsl:call-template name="score">
<xsl:with-param name="characterScore" select="characteristic/score"/>
<xsl:with-param name="pitScore" select="pit/score"/>
</xsl:call-template>
</characteristic>
</xsl:template>
<xsl:template match="creditRisk[not(pit)]">
<xsl:copy-of select="./*"/>
</xsl:template>
<xsl:template name="score">
<xsl:param name="characterScore"/>
<xsl:param name="pitScore"/>
<xsl:for-each select="$characterScore">
<xsl:variable name="character" select="."/>
<score>
<default>
<xsl:for-each select="$pitScore[SPID eq $character/SPID]">
<xsl:copy-of select="./node()"/>
</xsl:for-each>
</default>
<xsl:copy-of select="$character/node()"/>
</score>
</xsl:for-each>
</xsl:template>
Given memory node, it is only fair to have a go at XSLT 3
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="creditRisk[pit]">
<characteristic>
<xsl:call-template name="score">
<xsl:with-param name="characterScore" select="characteristic/score"/>
<xsl:with-param name="pitScore" select="pit/score"/>
</xsl:call-template>
</characteristic>
</xsl:template>
<xsl:template match="creditRisk[not(pit)]">
<xsl:apply-templates/>
</xsl:template>
<xsl:template name="score">
<xsl:param name="characterScore"/>
<xsl:param name="pitScore"/>
<xsl:for-each select="$characterScore">
<xsl:variable name="character" select="."/>
<score>
<default>
<xsl:for-each select="$pitScore[SPID eq $character/SPID]">
<xsl:apply-templates/>
</xsl:for-each>
</default>
<xsl:apply-templates/>
</score>
</xsl:for-each>
</xsl:template>
我有2批文件。在第 1 批中,我需要在其 SPID 等于 characteristic/score/SPID 时合并 pit/score。预期的合并看起来像第 2 批文档,characteristic/score/default 是 pit/score
的合并内容。如果文档已经有 characteristic/score/default
则保持原样。
Batch 1:
<creditRisk>
<characteristic>
<score>
<LID>C123</LID>
<SPID>106123</SPID>
<Sector>Real Estate, Rental and Leasing</Sector>
</score>
<score>
<LID>C470</LID>
<SPID>127999</SPID>
<Sector>Professional, Scientific and Technical Services</Sector>
</score>
</characteristic>
<pit>
<score>
<LID>C123</LID>
<SPID>106123</SPID>
<LTV>0.8654782868</LTV>
<LGD>0.099571924</LGD>
<Logarithm>-0.104884989</Logarithm>
</score>
<score>
<LID>C470</LID>
<SPID>127999</SPID>
<LTV>0.1950292239</LTV>
<LGD>0.4296130401</LGD>
<Logarithm>-0.561440272</Logarithm>
</score>
</pit>
</creditRisk>
Btach 2:
<creditRisk>
<characteristic>
<score>
<default>
<LID>C307</LID>
<SPID>363553</SPID>
<LTV>1.031735135</LTV>
<LGD>0.4421581764</LGD>
<Logarithm>-0.583679827</Logarithm>
</default>
<LID>C307</LID>
<SPID>363553</SPID>
<Sector>Manufacturing and Consumer Products</Sector>
</score>
<score>
<default>
<LID>C357</LID>
<SPID>329924</SPID>
<LTV>0.8326657196</LTV>
<LGD>0.1983093536</LGD>
<Logarithm>-0.221032473</Logarithm>
</default>
<LID>C357</LID>
<SPID>329924</SPID>
<Sector>Utilities, Construction and Other Infrastructure</Sector>
</score>
</characteristic>
</creditRisk>
预期输出:
第 1 批:
<characteristic>
<score>
<default>
<LID>C123</LID>
<SPID>106123</SPID>
<LTV>0.8654782868</LTV>
<LGD>0.099571924</LGD>
<Logarithm>-0.104884989</Logarithm>
</default>
<LID>C123</LID>
<SPID>106123</SPID>
<Sector>Real Estate, Rental and Leasing</Sector>
</score>
<score>
<default>
<LID>C470</LID>
<SPID>127999</SPID>
<LTV>0.1950292239</LTV>
<Recovery>0.5703869599</Recovery>
<LGD>0.4296130401</LGD>
<Logarithm>-0.561440272</Logarithm>
</default>
<LID>C470</LID>
<SPID>127999</SPID>
<Sector>Professional, Scientific and Technical Services</Sector>
</score>
</characteristic>
我的 xsl1 没有合并任何东西,只是清除了所有 pit
元素。
<xsl:template match="creditRisk">
<characteristic>
<xsl:for-each select="characteristic/score">
<score>
<default>
<xsl:for-each select="pit/score[SPID eq ./SPID]">
<xsl:copy-of select="./*"/>
</xsl:for-each>
</default>
<xsl:copy-of select="./*"/>
</score>
</xsl:for-each>
</characteristic>
</xsl:template>
我的 xsl2 因错误而失败: 不允许将超过一项的序列作为 'eq' (, , , ...)
的第二个操作数 <xsl:template match="creditRisk">
<characteristic>
<xsl:variable name="character" select="characteristic/score"/>
<xsl:variable name="pit" select="pit/score"/>
<xsl:choose>
<xsl:when test="fn:exists($pit)">
<xsl:for-each select="$character">
<score>
<default>
<xsl:for-each select="$pit[SPID eq $character/SPID]">
<xsl:copy-of select="./*"/>
</xsl:for-each>
</default>
<xsl:copy-of select="$character/*"/>
</score>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="."/>
</xsl:otherwise>
</xsl:choose>
</characteristic>
</xsl:template>
我怎样才能让我的 xsl 工作?由于依赖关系,我无法在 xsl 中使用
XSLT 2
<xsl:template match="creditRisk[pit]">
<characteristic>
<xsl:call-template name="score">
<xsl:with-param name="characterScore" select="characteristic/score"/>
<xsl:with-param name="pitScore" select="pit/score"/>
</xsl:call-template>
</characteristic>
</xsl:template>
<xsl:template match="creditRisk[not(pit)]">
<xsl:copy-of select="./*"/>
</xsl:template>
<xsl:template name="score">
<xsl:param name="characterScore"/>
<xsl:param name="pitScore"/>
<xsl:for-each select="$characterScore">
<xsl:variable name="character" select="."/>
<score>
<default>
<xsl:for-each select="$pitScore[SPID eq $character/SPID]">
<xsl:copy-of select="./node()"/>
</xsl:for-each>
</default>
<xsl:copy-of select="$character/node()"/>
</score>
</xsl:for-each>
</xsl:template>
Given memory node, it is only fair to have a go at XSLT 3
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="creditRisk[pit]">
<characteristic>
<xsl:call-template name="score">
<xsl:with-param name="characterScore" select="characteristic/score"/>
<xsl:with-param name="pitScore" select="pit/score"/>
</xsl:call-template>
</characteristic>
</xsl:template>
<xsl:template match="creditRisk[not(pit)]">
<xsl:apply-templates/>
</xsl:template>
<xsl:template name="score">
<xsl:param name="characterScore"/>
<xsl:param name="pitScore"/>
<xsl:for-each select="$characterScore">
<xsl:variable name="character" select="."/>
<score>
<default>
<xsl:for-each select="$pitScore[SPID eq $character/SPID]">
<xsl:apply-templates/>
</xsl:for-each>
</default>
<xsl:apply-templates/>
</score>
</xsl:for-each>
</xsl:template>