动态添加 XML 标记,并且不应该允许基于使用 XSLT 的 xml 中特定标记的计数重复
Posted
技术标签:
【中文标题】动态添加 XML 标记,并且不应该允许基于使用 XSLT 的 xml 中特定标记的计数重复【英文标题】:Adding XML tags dynamically and should not allow duplicates based on count of particular tags in xml using XSLT 【发布时间】:2021-10-30 18:17:56 【问题描述】:我很难根据一个 xml 标签的数量动态添加 xml 标签,并且不应该允许重复(我使用的是 XSLT 1.0)。例如:我在下面 xml 的“CreditorPPContractParts”部分中有 3 条债权人记录,如测试数据所示。
<PPPrivPropertyLine>
<InsuredProperties>
<Entry>
<Buildings>
<Entry>
<AlarmClass>None_De</AlarmClass>
<InterestType>OwnerOccupied_De</InterestType>
<BuildingStandard_De>Normal</BuildingStandard_De>
</Entry>
</Buildings>
<ContractParts>
<Entry>
<CreditorPPContractParts>
<Entry>
<Creditor>
<Contact>
<AddressBookUID>D73GLX</AddressBookUID>
</Contact>
</Creditor>
</Entry>
<Entry>
<Creditor>
<Contact>
<AddressBookUID>OAS5OE</AddressBookUID>
</Contact>
</Creditor>
</Entry>
<Entry>
<Creditor>
<Contact>
<AddressBookUID>OAS5OE</AddressBookUID>
</Contact>
</Creditor>
</Entry>
</CreditorPPContractParts>
</Entry>
</ContractParts>
</Entry>
</InsuredProperties>
<PolicyContactRoles></PolicyContactRoles>
</PPPrivPropertyLine>
现在我必须在 'PolicyContactRoles' 中以相同的 xml 格式创建 3 个条目,如下面的格式,因为我上面有 3 个债权人记录。我们可能有超过 3 个债权人记录,但我们需要根据债权人记录数添加。正如我上面所说,我们不应该允许重复。我们有一份重复的债权人记录。所以输出应该是 2 个债权人条目。
<PolicyContactRoles>
<Entry>
<AccountContactRole>
<Subtype>Creditor_De</Subtype>
<AccountContact>
<Contact>
<AddressBookUID>D73GLX</AddressBookUID>
</Contact>
</AccountContact>
</AccountContactRole>
<Subtype>PolicyCreditor_De</Subtype>
</Entry>
<Entry>
<AccountContactRole>
<Subtype>Creditor_De</Subtype>
<AccountContact>
<Contact>
<AddressBookUID>OAS5OE</AddressBookUID>
</Contact>
</AccountContact>
</AccountContactRole>
<Subtype>PolicyCreditor_De</Subtype>
</Entry>
</PolicyContactRoles>
我已经使用下面的 XSLT 脚本完成了它。但无法避免重复。请帮帮我,谢谢!
<xsl:template match="PolicyContactRoles">
<xsl:copy>
<xsl:apply-templates select="//Creditor" mode="pcr"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Creditor" mode="pcr">
<Entry>
<AccountContactRole>
<Subtype>Creditor_De</Subtype>
<AccountContact>
<Contact>
<xsl:copy-of select=".//AddressBookUID"/>
</Contact>
</AccountContact>
</AccountContactRole>
<Subtype>PolicyCreditor_De</Subtype>
</Entry>
</xsl:template>
另外,请使用这个 XSLT Fiddle:https://xsltfiddle.liberty-development.net/pNEj9dH/13
【问题讨论】:
【参考方案1】:使用Muenchian grouping 仅获取不同的债权人:
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="creditor" match="Creditor" use="Contact/AddressBookUID" />
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="PolicyContactRoles">
<xsl:copy>
<xsl:for-each select="//Creditor[count(. | key('creditor', Contact/AddressBookUID)[1]) = 1]">
<Entry>
<AccountContactRole>
<Subtype>Creditor_De</Subtype>
<AccountContact>
<Contact>
<xsl:copy-of select="Contact/AddressBookUID"/>
</Contact>
</AccountContact>
</AccountContactRole>
<Subtype>PolicyCreditor_De</Subtype>
</Entry>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
【讨论】:
嗨 michael.hor257k,感谢您的快速解决方案。它有效,但是当我将它集成到实时项目中时,遇到了不同的问题。实际上,除了债权人条目,我们在“PolicyContactRoles”部分还有另外 2 个具有不同子类型 [Policy_holder 和 BillingContact] 的现有条目。如果我应用您的代码,则缺少这两个条目。看到这个:xsltfiddle.liberty-development.net/pNEj9dH/14 在添加新条目之前(或之后)<xsl:copy-of select="Entry"/>
也是如此。以上是关于动态添加 XML 标记,并且不应该允许基于使用 XSLT 的 xml 中特定标记的计数重复的主要内容,如果未能解决你的问题,请参考以下文章
Windows 10 应用开发使用x:Bind标记动态获得计算结果
IntelliJ Idea标记红色web.xml运行良好[关闭]