我是XSLT的新手,我不知道如何完成以下任务。
以下是由其他程序生成的文档的一部分。通过XSLT,我想根据条件在该位置添加一个额外的元素。
<?xml version="1.0" encoding="utf-8"?>
<policies>
<policy>
<policyKey>
<policyNbr>004567</policyNbr>
<policyEffectiveDt>2014-11-14</policyEffectiveDt>
<policyID>54545</policyID>
<policyFormCd>
<code>669</code>
</policyFormCd>
</policyKey>
<transactionSplitTrans>
<ContractRole>ABC</ContractRole>
<code>SCBP</code>
<test>123</test>
</transactionSplitTrans>
<transactionSplitTrans>
<ContractRole>DEF</ContractRole>
<code>SCBP</code>
<test>123</test>
</transactionSplitTrans>
<Copies>
<Copy>
<Type>Original</Type>
<RecipientRole>ABC</RecipientRole>
</Copy>
<Copy>
<Type>Duplicate</Type>
<RecipientRole>XYZ</RecipientRole>
</Copy>
</Copies>
</policy>
</policies>
我正在尝试将transactionSplitTrans内的ContractRole标记与Copies Tag内的RecipientRole标记进行比较。如果值匹配,我想添加一个名为Indicator的新标签,其值Y低于ContractRole Tag.And Type Tag(下面)来自Copies标签的指标标签。否则,在ContractRole标签下方添加一个新标签指示器,其值为N,并在Copies Tag中添加Type Tag(在指示器标签下方)。然后从输出中删除Copies Tag。
预期产出:
<?xml version="1.0" encoding="utf-8"?>
<policies>
<policy>
<policyKey>
<policyNbr>004567</policyNbr>
<policyEffectiveDt>2014-11-14</policyEffectiveDt>
<policyID>54545</policyID>
<policyFormCd>
<code>669</code>
</policyFormCd>
</policyKey>
<transactionSplitTrans>
<ContractRole>ABC</ContractRole>
<indicator>Y</indicator>
<Type>Original</Type>
<code>SCBP</code>
<test>123</test>
</transactionSplitTrans>
<transactionSplitTrans>
<ContractRole>DEF</ContractRole>
<indicator>N</indicator>
<Type>Duplicate</Type>
<code>SCBP</code>
<test>123</test>
</transactionSplitTrans>
</policy>
</policies>
我的XSLT:
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="transactionSplitTrans">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
<xsl:variable name="thisaccess" select="//ContractRole" />
<xsl:choose>
<xsl:when test="//Copies/Copy[RecipientRole=$thisaccess]">
<Indicator>Y</Indicator>
<Type><xsl:value-of select="//Copies/Copy/Type"/></Type>
</xsl:when>
<xsl:otherwise>
<Indicator>N</Indicator>
<Type><xsl:value-of select="//Copies/Copy/Type"/></Type>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:0)
AFAICT,你想做类似的事情:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="copy" match="Copy" use="RecipientRole" />
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ContractRole">
<xsl:copy-of select="."/>
<xsl:variable name="copy" select="key('copy', .)" />
<indicator>
<xsl:choose>
<xsl:when test="$copy">Y</xsl:when>
<xsl:otherwise>N</xsl:otherwise>
</xsl:choose>
</indicator>
<xsl:copy-of select="$copy/Type"/>
</xsl:template>
<xsl:template match="Copies"/>
</xsl:stylesheet>
应用于您的示例输入,结果将是:
<?xml version="1.0" encoding="UTF-8"?>
<policies>
<policy>
<policyKey>
<policyNbr>004567</policyNbr>
<policyEffectiveDt>2014-11-14</policyEffectiveDt>
<policyID>54545</policyID>
<policyFormCd>
<code>669</code>
</policyFormCd>
</policyKey>
<transactionSplitTrans>
<ContractRole>ABC</ContractRole>
<indicator>Y</indicator>
<Type>Original</Type>
<code>SCBP</code>
<test>123</test>
</transactionSplitTrans>
<transactionSplitTrans>
<ContractRole>DEF</ContractRole>
<indicator>N</indicator>
<code>SCBP</code>
<test>123</test>
</transactionSplitTrans>
</policy>
</policies>
重要提示:这与您的预期输出不同:第二个transactionSplitTrans
,ContractRole
为“DEF”,不一个Type
元素,因为我不知道它应该来自何处。