使用 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

【问题讨论】:

&lt;AddressBookUID&gt;XN8DOW&lt;/AddressBookUID&gt;的值从何而来? @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 条件,但没有工作: @SwathiVenigalla,请参阅有关分组/识别重复项的任何介绍,例如 ***.com/tags/xslt-grouping/info,也许可以使用 &lt;xsl:for-each-group select="//Creditor" group-by=".//AddressBookUID"&gt;&lt;xsl:apply-templates select="." mode="pcr"/&gt;&lt;/xsl:for-each-group&gt; 代替 &lt;xsl:apply-templates select="//Creditor" mode="pcr"/&gt;。如果这没有帮助,请提出一个包含必要细节的新问题。 嗨 Martin,我已经尝试过了,但 XSLT 1.0 不接受“for-each-group”。当然,我会提出一个包含必要细节的新问题,并会在此处为您提供链接。谢谢! 嗨@Martin,创建了带有所需详细信息的单独问题。请参考以下链接。谢谢! ***.com/questions/69010484/…

以上是关于使用 XSLT 根据 xml 中特定标签的数量动态添加 XML 标签的主要内容,如果未能解决你的问题,请参考以下文章

XSLT 用于根据元素的属性对特定 XML 标记的元素进行排序

有没有办法使用 XSLT 基于 XML 中的元素复制 XML 节点 n 次?

有没有办法使用 XSLT 基于 XML 中的元素复制 XML 节点 n 次?

如何使用 XSLT 从 XML 中删除元素标记

XSLT 删除 XML 的多个元素

根据 XSLT 中的特定节点值获取节点