使用 XSLT 根据 xml 中特定标签的数量动态添加 XML 标签
Posted
技术标签:
【中文标题】使用 XSLT 根据 xml 中特定标签的数量动态添加 XML 标签【英文标题】:Adding XML tags dynamically based on count of particular tags in xml using XSLT 【发布时间】:2021-10-14 18:28:18 【问题描述】:我遇到了一个挑战,即根据一个 xml 标签的数量动态添加 xml 标签。例如:我在下面 xml 的“CreditorPPContractParts”部分中有 2 条债权人记录,如测试数据所示。
<PPPrivPropertyLine>
<InsuredProperties>
<Entry>
<Buildings>
<Entry>
<AlarmClass>None_De</AlarmClass>
<InterestType>OwnerOccupied_De</InterestType>
<BuildingStandard_De>Normal</BuildingStandard_De>
</Entry>
</Buildings>
<ContractParts>
<Entry>
<CreditorPPContractParts>
<Entry>
<ReferenceNumber>SSG-SGLAKTZN gel. wg. EU-DSGVO</ReferenceNumber>
<InsuranceCoverage>0</InsuranceCoverage>
<IssueDate>2016-09-08T00:00:00+02:00</IssueDate>
<Creditor>
<Contact>
<AddressBookUID>D73GLX</AddressBookUID>
</Contact>
</Creditor>
</Entry>
<Entry>
<ReferenceNumber>SSG-SGLAKTZN gel. wg. EU-DSGVO</ReferenceNumber>
<InsuranceCoverage>0</InsuranceCoverage>
<IssueDate>1979-10-17T00:00:00+01:00</IssueDate>
<Creditor>
<Contact>
<AddressBookUID>OAS5OE</AddressBookUID>
</Contact>
</Creditor>
</Entry>
</CreditorPPContractParts>
</Entry>
</ContractParts>
</Entry>
</InsuredProperties>
<PolicyContactRoles></PolicyContactRoles>
</PPPrivPropertyLine>
现在我必须在“PolicyContactRoles”中以相同的 xml 格式创建 2 个条目,如下面的格式,因为我上面有 2 个债权人记录。我们可能有超过 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>
我已经为单张唱片做了。我不知道如何实现多个债权人记录。请帮帮我,谢谢!
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<!--copy all nodes and attributes-->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:param name="old2" select="PPPrivPropertyLine/InsuredProperties/Entry/ContractParts/Entry/CreditorPPContractParts/Entry/Creditor/Contact/AddressBookUID"/>
<xsl:template match="PolicyContactRoles">
<xsl:copy>
<xsl:if test="$old2 != ''">
<Entry>
<AccountContactRole>
<Subtype>Creditor_De</Subtype>
<AccountContact>
<Contact>
<AddressBookUID>
<xsl:value-of select="$old2"/>
</AddressBookUID>
</Contact>
</AccountContact>
</AccountContactRole>
<Subtype>PolicyCreditor_De</Subtype>
</Entry>
</xsl:if>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
另外,请使用这个 XSLT Fiddle:https://xsltfiddle.liberty-development.net/pNEj9dH/11
【问题讨论】:
<AddressBookUID>XN8DOW</AddressBookUID>
的值从何而来?
@michael.hor257k :对不起,迈克尔,我更新错了。现已更正。并感谢您的回复。问题已解决
【参考方案1】:
只需处理 Creditor
元素,例如
<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>
【讨论】:
说真的!!!它按预期工作。 5 分钟内提供完美答案。伟大的!!非常感谢你的帮助。非常感谢! 嗨@Martin Honnen,我遇到了同样的情况,但在添加债权人记录时不应允许重复记录。你也可以帮我解决这个问题。提前致谢。我添加了 if 条件,但没有工作:<xsl:for-each-group select="//Creditor" group-by=".//AddressBookUID"><xsl:apply-templates select="." mode="pcr"/></xsl:for-each-group>
代替 <xsl:apply-templates select="//Creditor" mode="pcr"/>
。如果这没有帮助,请提出一个包含必要细节的新问题。
嗨 Martin,我已经尝试过了,但 XSLT 1.0 不接受“for-each-group”。当然,我会提出一个包含必要细节的新问题,并会在此处为您提供链接。谢谢!
嗨@Martin,创建了带有所需详细信息的单独问题。请参考以下链接。谢谢! ***.com/questions/69010484/…以上是关于使用 XSLT 根据 xml 中特定标签的数量动态添加 XML 标签的主要内容,如果未能解决你的问题,请参考以下文章
XSLT 用于根据元素的属性对特定 XML 标记的元素进行排序
有没有办法使用 XSLT 基于 XML 中的元素复制 XML 节点 n 次?