【问题标题】:Adding XML tags dynamically and should not allow duplicates based on count of particular tags in xml using XSLT动态添加 XML 标记,并且不应该允许基于使用 XSLT 的 xml 中特定标记的计数重复
【发布时间】: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

【问题讨论】:

    标签: javascript xml xslt


    【解决方案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
    • 在添加新条目之前(或之后)&lt;xsl:copy-of select="Entry"/&gt; 也是如此。
    猜你喜欢
    • 1970-01-01
    • 2021-10-14
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    相关资源
    最近更新 更多