删除 xslt 中的重复字符串

Remove repeated string in xslt

我需要删除字符串的重复条目或合并复杂类型元素的内容。 我想将其更改为这种格式::

<?xml version="1.0" encoding="UTF-8"?>
<EMailData>

<property name="EVENTINFO">

 <property name="City">
    <value>City1111</value>
 </property>
 <property name="Country">
    <value>Country1112</value>
 </property>
 <property name="Zip">
    <value>Zip1113</value>
 </property>

 <property name="Household">
    <row>
       <property name="HouseholdNumber">
          <value>HouseholdNumber1173</value>
       </property>
       <property name="HouseholdName">
          <value>HouseholdName1174</value>
       </property>
       <property name="HouseholdStatus">
          <value>HouseholdStatus1175</value>
       </property>
       <property name="HouseholdPrimaryContactID">
          <value>HouseholdPrimaryContactID1176</value>
       </property>
    </row>
    <row> // **Second occurance as new row and not new element itself**
       <!-- Values -->
    </row> 
 </property>
 <property name="FFStatus">
 <row>
  <!-- Values -->
 </row>
  <row>
  <--values-->
  </row>
  </property>
  ....

我如何在 xslt 中执行此操作。

我尝试使用 translate()。但是我被卡住了,因为我只需要从字符串的第二次出现中删除。

编辑

输入文件-整个

            <?xml version="1.0" encoding="UTF-8"?>
        <EMailData>
           <property name="EVENTINFO">
              <property name="PersonInfo">
                 <property name="PersonID">
                    <value>PersonID1092</value>
                 </property>
                 <property name="EmailAddress">
                    <value>EmailAddress1093</value>
                 </property>
                 <property name="Household">
                    <row>
                       <property name="HouseholdNumber">
                          <value>HouseholdNumber1173</value>
                       </property>
                       <property name="HouseholdName">
                          <value>HouseholdName1174</value>
                       </property>
                       <property name="HouseholdStatus">
                          <value>HouseholdStatus1175</value>
                       </property>
                       <property name="HouseholdPrimaryContactID">
                          <value>HouseholdPrimaryContactID1176</value>
                       </property>
                    </row>
                 </property>
                 <property name="Household">
                    <row>
                       <property name="HouseholdNumber">
                          <value>HouseholdNumber1177</value>
                       </property>
                       <property name="HouseholdName">
                          <value>HouseholdName1178</value>
                       </property>
                       <property name="HouseholdStatus">
                          <value>HouseholdStatus1179</value>
                       </property>
                       <property name="HouseholdPrimaryContactID">
                          <value>HouseholdPrimaryContactID1180</value>
                       </property>
                    </row>
                 </property>
                 <property name="FFStatus">
                    <row>
                       <property name="FFCount">
                          <value>FFCount1187</value>
                       </property>
                       <property name="FFCycleStartDate">
                          <value>2015-02-05</value>
                       </property>
                       <property name="FFSubclassName">
                          <value>FFSubclassName1188</value>
                       </property>
                    </row>
                 </property>
                 <property name="FFStatus">
                    <row>
                       <property name="FFCount">
                          <value>FFCount1189</value>
                       </property>
                       <property name="FFCycleStartDate">
                          <value>2015-02-05</value>
                       </property>
                       <property name="FFSubclassName">
                          <value>FFSubclassName1190</value>
                       </property>
                    </row>
                 </property>
                 <property name="Offers">
                    <row>
                       <property name="OfferCode">
                          <value>OfferCode1191</value>
                       </property>
                       <property name="IsPALSReward">
                          <value>IsPALSReward1192</value>
                       </property>
                       <property name="ExpirationDate">
                          <value>2015-02-05</value>
                       </property>
                       <property name="OfferDescription">
                          <value>OfferDescription1193</value>
                       </property>
                       <property name="OfferTitle">
                          <value>OfferTitle1194</value>
                       </property>
                    </row>
                 </property>
                 <property name="Offers">
                    <row>
                       <property name="OfferCode">
                          <value>OfferCode1202</value>
                       </property>
                       <property name="IsPALSReward">
                          <value>IsPALSReward1203</value>
                       </property>
                       <property name="ExpirationDate">
                          <value>2015-02-05</value>
                       </property>
                       <property name="OfferDescription">
                          <value>OfferDescription1204</value>
                       </property>
                       <property name="OfferTitle">
                          <value>OfferTitle1205</value>
                       </property>
                       <property name="OfferType">
                          <value>OfferType1206</value>
                       </property>
                    </row>
                 </property>
                 <property name="Order">
                    <row>
                       <property name="OrderID">
                          <value>OrderID1224</value>
                       </property>
                       <property name="CustomerOrderNumber">
                          <value>CustomerOrderNumber1225</value>
                       </property>
                       <property name="OrderType">
                          <value/>
                       </property>
                       <property name="Currency">
                          <value>Currency1226</value>
                       </property>
                       <property name="OrderName">
                          <value/>
                       </property>
                       <property name="OrderFrequency">
                          <value>OrderFrequency1227</value>
                       </property>
                       <property name="IsRepeatDeliveryOrder">
                          <value>IsRepeatDeliveryOrder1228</value>
                       </property>
                       <property name="ProjectedShipmentDate">
                          <value>2015-02-05</value>
                       </property>
                       <property name="NextShipmentDate">
                          <value>2015-02-05</value>
                       </property>
                       <property name="Total">
                          <value>1229</value>
                       </property>
                    </row>
                 </property>
                 <property name="Order">
                    <row>
                       <property name="OrderID">
                          <value>OrderID1259</value>
                       </property>
                       <property name="CustomerOrderNumber">
                          <value>CustomerOrderNumber1260</value>
                       </property>
                       <property name="OrderType">
                          <value/>
                       </property>
                       <property name="Currency">
                          <value>Currency1261</value>
                       </property>
                       <property name="OrderName">
                          <value/>
                       </property>
                       <property name="OrderFrequency">
                          <value>OrderFrequency1262</value>
                       </property>
                       <property name="IsRepeatDeliveryOrder">
                          <value>IsRepeatDeliveryOrder1263</value>
                       </property>
                       <property name="ProjectedShipmentDate">
                          <value>2015-02-05</value>
                       </property>
                       <property name="NextShipmentDate">
                          <value>2015-02-05</value>
                       </property>
                       <property name="Total">
                          <value>1264</value>
                       </property>
                       <property name="Subtotal">
                          <value>1265</value>
                       </property>
                       <property name="SalesTax">
                          <value>1266</value>
                       </property>
                       <property name="ShippingAmount">
                          <value>1267</value>
                       </property>
                       <property name="ShippingDiscount">
                          <value>1268</value>
                       </property>
                       <property name="OtherDiscount">
                          <value>1269</value>
                       </property>
                       <property name="TotalDiscount">
                          <value>1270</value>
                       </property>
                       <property name="Surcharge">
                          <value>1271</value>
                       </property>
                       <property name="TimePlaced">
                          <value>TimePlaced1272</value>
                       </property>
                       <property name="OrderURL">
                          <value>OrderURL1273</value>
                       </property>
                       <property name="ShippingAddressLine1">
                          <value>ShippingAddressLine11274</value>
                       </property>
                       <property name="ShippingAddressLine2">
                          <value>ShippingAddressLine21275</value>
                       </property>
                       <property name="ShippingState">
                          <value>ShippingState1276</value>
                       </property>
                       <property name="ShippingCity">
                          <value>ShippingCity1277</value>
                       </property>
                       <property name="ShippingCountry">
                          <value>ShippingCountry1278</value>
                       </property>
                       <property name="ShippingZip">
                          <value>ShippingZip1279</value>
                       </property>
                       <property name="ShippingZipExtension">
                          <value>ShippingZipExtension1280</value>
                       </property>
                       <property name="PurchaseStoreNumber">
                          <value>PurchaseStoreNumber1281</value>
                       </property>
                       <property name="PurchaseStoreName">
                          <value>PurchaseStoreName1282</value>
                       </property>
                       <property name="PurchaseStoreMainPhoneNumber">
                          <value>PurchaseStoreMainPhoneNumber1283</value>
                       </property>
                       <property name="PurchaseStoreAddress1">
                          <value>PurchaseStoreAddress11284</value>
                       </property>
                       <property name="PurchaseStoreAddress2">
                          <value>PurchaseStoreAddress21285</value>
                       </property>
                       <property name="PurchaseStoreAddress3">
                          <value>PurchaseStoreAddress31286</value>
                       </property>
                       <property name="PurchaseStoreCity">
                          <value>PurchaseStoreCity1287</value>
                       </property>
                       <property name="PurchaseStoreState">
                          <value>PurchaseStoreState1288</value>
                       </property>
                       <property name="PurchaseStoreCountry">
                          <value>PurchaseStoreCountry1289</value>
                       </property>
                       <property name="PurchaseStoreZip">
                          <value>PurchaseStoreZip1290</value>
                       </property>
                       <property name="PurchaseStoreZipExtension">
                          <value>PurchaseStoreZipExtension1291</value>
                       </property>
                       <property name="PurchaseStoreZoneName">
                          <value>PurchaseStoreZoneName1292</value>
                       </property>
                       <property name="PurchaseStoreDistrictName">
                          <value>PurchaseStoreDistrictName1293</value>
                       </property>
                       <property name="OrderTender">
                          <value/>
                       </property>
                       <property name="OrderTender">
                          <value/>
                       </property>
                       <property name="OrderTender">
                          <value/>
                       </property>
                       <property name="OrderDetail">
                          <value/>
                       </property>
                       <property name="OrderDetail">
                          <value/>
                       </property>
                       <property name="OrderDetail">
                          <value/>
                       </property>
                    </row>
                 </property>
                 <property name="Order">
                    <row>
                       <property name="OrderID">
                          <value>OrderID1294</value>
                       </property>
                       <property name="CustomerOrderNumber">
                          <value>CustomerOrderNumber1295</value>
                       </property>
                       <property name="OrderType">
                          <value/>
                       </property>
                       <property name="Currency">
                          <value>Currency1296</value>
                       </property>
                       <property name="OrderName">
                          <value/>
                       </property>
                       <property name="OrderFrequency">
                          <value>OrderFrequency1297</value>
                       </property>
                       <property name="IsRepeatDeliveryOrder">
                          <value>IsRepeatDeliveryOrder1298</value>
                       </property>
                       <property name="ProjectedShipmentDate">
                          <value>2015-02-05</value>
                       </property>
                       <property name="NextShipmentDate">
                          <value>2015-02-05</value>
                       </property>
                       <property name="Total">
                          <value>1299</value>
                       </property>
                    </row>
                 </property>
                 <property name="Pet">
                    <row>
                       <property name="PetID">
                          <value>PetID1329</value>
                       </property>
                       <property name="PetName">
                          <value>PetName1330</value>
                       </property>
                       <property name="PetType">
                          <value>PetType1331</value>
                       </property>
                       <property name="ActiveFlag">
                          <value>ActiveFlag1332</value>
                       </property>
                       <property name="DateCreated">
                          <value>2015-02-05</value>
                       </property>
                       <property name="DateModified">
                          <value>2015-02-05</value>
                       </property>
                       <property name="BreedName">
                          <value>BreedName1333</value>
                       </property>
                       <property name="DateOfBirth">
                          <value>2015-02-05</value>
                       </property>
                       <property name="Gender">
                          <value>Gender1334</value>
                       </property>
                       <property name="NextGroomDate">
                          <value>2015-02-05</value>
                       </property>
                       <property name="PreferredStylist">
                          <value>PreferredStylist1335</value>
                       </property>
                       <property name="RabiesExpiration">
                          <value>2015-02-05</value>
                       </property>
                       <property name="RabiesVerifyBy">
                          <value>RabiesVerifyBy1336</value>
                       </property>
                    </row>
                 </property>
                 <property name="Pet">
                    <row>
                       <property name="PetID">
                          <value>PetID1345</value>
                       </property>
                       <property name="PetName">
                          <value>PetName1346</value>
                       </property>
                       <property name="PetType">
                          <value>PetType1347</value>
                       </property>
                       <property name="ActiveFlag">
                          <value>ActiveFlag1348</value>
                       </property>
                       <property name="DateCreated">
                          <value>2015-02-05</value>
                       </property>
                       <property name="DateModified">
                          <value>2015-02-05</value>
                       </property>
                       <property name="BreedName">
                          <value>BreedName1349</value>
                       </property>
                       <property name="DateOfBirth">
                          <value>2015-02-05</value>
                       </property>
                       <property name="Gender">
                          <value>Gender1350</value>
                       </property>
                       <property name="NextGroomDate">
                          <value>2015-02-05</value>
                       </property>
                       <property name="PreferredStylist">
                          <value>PreferredStylist1351</value>
                       </property>
                       <property name="RabiesExpiration">
                          <value>2015-02-05</value>
                       </property>
                       <property name="RabiesVerifyBy">
                          <value>RabiesVerifyBy1352</value>
                       </property>
                    </row>
                 </property>
                 <property name="Appointment">
                    <row>
                       <property name="AppointmentId">
                          <value>AppointmentId1353</value>
                       </property>
                       <property name="DepartmentName">
                          <value>DepartmentName1354</value>
                       </property>
                       <property name="ClientFirstName">
                          <value>ClientFirstName1355</value>
                       </property>
                       <property name="ClientLastName">
                          <value>ClientLastName1356</value>
                       </property>
                       <property name="PetName">
                          <value>PetName1357</value>
                       </property>
                       <property name="IsCanceled">
                          <value>IsCanceled1358</value>
                       </property>
                       <property name="StatusConditionId">
                          <value>StatusConditionId1359</value>
                       </property>
                       <property name="IsNoShow">
                          <value>IsNoShow1360</value>
                       </property>
                       <property name="AppointmentStatus">
                          <value>AppointmentStatus1361</value>
                       </property>
                       <property name="ResourceFirstName">
                          <value>ResourceFirstName1362</value>
                       </property>
                       <property name="ResourceLastName">
                          <value>ResourceLastName1363</value>
                       </property>
                       <property name="Duration">
                          <value>Duration1364</value>
                       </property>
                       <property name="DropOffTime">
                          <value>2015-02-05</value>
                       </property>
                       <property name="PickUpTime">
                          <value>2015-02-05</value>
                       </property>
                       <property name="LowEstimate">
                          <value>1365</value>
                       </property>
                       <property name="HighEstimate">
                          <value>1366</value>
                       </property>
                       <property name="SKU">
                          <value>SKU1367</value>
                       </property>
                       <property name="AppointmentStoreNumber">
                          <value>AppointmentStoreNumber1368</value>
                       </property>
                       <property name="AppointmentStoreName">
                          <value>AppointmentStoreName1369</value>
                       </property>
                       <property name="AppointmentStoreMainPhoneNumber">
                          <value>AppointmentStoreMainPhoneNumber1370</value>
                       </property>
                       <property name="AppointmentStoreAddress1">
                          <value>AppointmentStoreAddress11371</value>
                       </property>
                       <property name="AppointmentStoreAddress2">
                          <value>AppointmentStoreAddress21372</value>
                       </property>
                       <property name="AppointmentStoreAddress3">
                          <value>AppointmentStoreAddress31373</value>
                       </property>
                       <property name="AppointmentStoreState">
                          <value>AppointmentStoreState1374</value>
                       </property>
                       <property name="AppointmentStoreCity">
                          <value>AppointmentStoreCity1375</value>
                       </property>
                       <property name="AppointmentStoreCountry">
                          <value>AppointmentStoreCountry1376</value>
                       </property>
                       <property name="AppointmentStoreZip">
                          <value>AppointmentStoreZip1377</value>
                       </property>
                       <property name="AppointmentStoreZipExtension">
                          <value>AppointmentStoreZipExtension1378</value>
                       </property>
                       <property name="AppointmentStoreZoneName">
                          <value>AppointmentStoreZoneName1379</value>
                       </property>
                       <property name="AppointmentStoreDistrictName">
                          <value>AppointmentStoreDistrictName1380</value>
                       </property>
                    </row>
                 </property>
                 <property name="Appointment">
                    <row>
                       <property name="AppointmentId">
                          <value>AppointmentId1381</value>
                       </property>
                       <property name="DepartmentName">
                          <value>DepartmentName1382</value>
                       </property>
                       <property name="ClientFirstName">
                          <value>ClientFirstName1383</value>
                       </property>
                       <property name="ClientLastName">
                          <value>ClientLastName1384</value>
                       </property>
                       <property name="PetName">
                          <value>PetName1385</value>
                       </property>
                       <property name="IsCanceled">
                          <value>IsCanceled1386</value>
                       </property>
                       <property name="StatusConditionId">
                          <value>StatusConditionId1387</value>
                       </property>
                       <property name="IsNoShow">
                          <value>IsNoShow1388</value>
                       </property>
                       <property name="AppointmentStatus">
                          <value>AppointmentStatus1389</value>
                       </property>
                       <property name="ResourceFirstName">
                          <value>ResourceFirstName1390</value>
                       </property>
                       <property name="ResourceLastName">
                          <value>ResourceLastName1391</value>
                       </property>
                       <property name="Duration">
                          <value>Duration1392</value>
                       </property>
                       <property name="DropOffTime">
                          <value>2015-02-05</value>
                       </property>
                       <property name="PickUpTime">
                          <value>2015-02-05</value>
                       </property>
                       <property name="LowEstimate">
                          <value>1393</value>
                       </property>
                       <property name="HighEstimate">
                          <value>1394</value>
                       </property>
                       <property name="SKU">
                          <value>SKU1395</value>
                       </property>
                       <property name="AppointmentStoreNumber">
                          <value>AppointmentStoreNumber1396</value>
                       </property>
                       <property name="AppointmentStoreName">
                          <value>AppointmentStoreName1397</value>
                       </property>
                       <property name="AppointmentStoreMainPhoneNumber">
                          <value>AppointmentStoreMainPhoneNumber1398</value>
                       </property>
                       <property name="AppointmentStoreAddress1">
                          <value>AppointmentStoreAddress11399</value>
                       </property>
                       <property name="AppointmentStoreAddress2">
                          <value>AppointmentStoreAddress21400</value>
                       </property>
                       <property name="AppointmentStoreAddress3">
                          <value>AppointmentStoreAddress31401</value>
                       </property>
                       <property name="AppointmentStoreState">
                          <value>AppointmentStoreState1402</value>
                       </property>
                       <property name="AppointmentStoreCity">
                          <value>AppointmentStoreCity1403</value>
                       </property>
                       <property name="AppointmentStoreCountry">
                          <value>AppointmentStoreCountry1404</value>
                       </property>
                       <property name="AppointmentStoreZip">
                          <value>AppointmentStoreZip1405</value>
                       </property>
                       <property name="AppointmentStoreZipExtension">
                          <value>AppointmentStoreZipExtension1406</value>
                       </property>
                       <property name="AppointmentStoreZoneName">
                          <value>AppointmentStoreZoneName1407</value>
                       </property>
                       <property name="AppointmentStoreDistrictName">
                          <value>AppointmentStoreDistrictName1408</value>
                       </property>
                    </row>
                 </property>
                 <property name="Appointment">
                    <row>
                       <property name="AppointmentId">
                          <value>AppointmentId1409</value>
                       </property>
                       <property name="DepartmentName">
                          <value>DepartmentName1410</value>
                       </property>
                       <property name="ClientFirstName">
                          <value>ClientFirstName1411</value>
                       </property>
                       <property name="ClientLastName">
                          <value>ClientLastName1412</value>
                       </property>
                       <property name="PetName">
                          <value>PetName1413</value>
                       </property>
                       <property name="IsCanceled">
                          <value>IsCanceled1414</value>
                       </property>
                       <property name="StatusConditionId">
                          <value>StatusConditionId1415</value>
                       </property>
                       <property name="IsNoShow">
                          <value>IsNoShow1416</value>
                       </property>
                       <property name="AppointmentStatus">
                          <value>AppointmentStatus1417</value>
                       </property>
                       <property name="ResourceFirstName">
                          <value>ResourceFirstName1418</value>
                       </property>
                       <property name="ResourceLastName">
                          <value>ResourceLastName1419</value>
                       </property>
                       <property name="Duration">
                          <value>Duration1420</value>
                       </property>
                       <property name="DropOffTime">
                          <value>2015-02-05</value>
                       </property>
                       <property name="PickUpTime">
                          <value>2015-02-05</value>
                       </property>
                       <property name="LowEstimate">
                          <value>1421</value>
                       </property>
                       <property name="HighEstimate">
                          <value>1422</value>
                       </property>
                       <property name="SKU">
                          <value>SKU1423</value>
                       </property>
                       <property name="AppointmentStoreNumber">
                          <value>AppointmentStoreNumber1424</value>
                       </property>
                       <property name="AppointmentStoreName">
                          <value>AppointmentStoreName1425</value>
                       </property>
                       <property name="AppointmentStoreMainPhoneNumber">
                          <value>AppointmentStoreMainPhoneNumber1426</value>
                       </property>
                       <property name="AppointmentStoreAddress1">
                          <value>AppointmentStoreAddress11427</value>
                       </property>
                       <property name="AppointmentStoreAddress2">
                          <value>AppointmentStoreAddress21428</value>
                       </property>
                       <property name="AppointmentStoreAddress3">
                          <value>AppointmentStoreAddress31429</value>
                       </property>
                       <property name="AppointmentStoreState">
                          <value>AppointmentStoreState1430</value>
                       </property>
                       <property name="AppointmentStoreCity">
                          <value>AppointmentStoreCity1431</value>
                       </property>
                       <property name="AppointmentStoreCountry">
                          <value>AppointmentStoreCountry1432</value>
                       </property>
                       <property name="AppointmentStoreZip">
                          <value>AppointmentStoreZip1433</value>
                       </property>
                       <property name="AppointmentStoreZipExtension">
                          <value>AppointmentStoreZipExtension1434</value>
                       </property>
                       <property name="AppointmentStoreZoneName">
                          <value>AppointmentStoreZoneName1435</value>
                       </property>
                       <property name="AppointmentStoreDistrictName">
                          <value>AppointmentStoreDistrictName1436</value>
                       </property>
                    </row>
                 </property>
              </property>
           </property>
        </EMailData>

这是一个 XSLT 1.0 样式表,适用于您的最新示例,其中要分组的元素是树下方的嵌套级别:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>

<xsl:key name="group" match="/*/*/*/property" use="@name"/>

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="/*/*/*[property[@name]]">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:for-each select="*[generate-id() = generate-id(key('group', @name)[1])]">
      <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates select="key('group', @name)/*"/>
      </xsl:copy>
    </xsl:for-each>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>