2012-04-18 97 views
2
<BookList> 
    <Book> 
    <History> 
    <Type>history</Type> 
    <Prize>123</Prize> 
    <Publication>`` 
    <Name>YEAP1</Name> 
    </Publication> 
    <RNumber Type="VolumeNumber">11111</RNumber> 
    <RNumber Type="SupplementNumber">123456</RNumber> 
    </History> 
    <chemistry> 
    <Type>chemistry</Type> 
    <Prize>333</Prize> 
    <Publication> 
    <Name>YEAP</Name> 
    </Publication> 
    <RNumber Type="VolumeNumber">11111</RNumber> 
    <RNumber Type="SupplementNumber">45454</RNumber> 
    </chemistry> 
         ...... 

    </Book> 
    </BookList> 

有重複的VolumnNumber 11111如何使用xslt檢查BoolList xml中的重複的VolumnNumber。如何使用xslt檢查重複的元素值

false() 
    or 
    /*/*/*/RNumber 
      [@Type='VolumeNumber' 
      and 
      . = ../preceding-sibling::* 
        /RNumber[@Type='VolumeNumber'] 
      ] 

這是一個完整的XSLT轉換,用於評估該XPath表達式和本次評測結果輸出:請在此

+0

可能的複製用: http://stackoverflow.com/questions/157705/checking-for-a-duplicate-element-in-the-output-using-xslt – 2012-04-18 18:56:50

+0

你只是想檢查是否有重複?預期產出應該是什麼樣子? (即,顯示哪些卷是重複的HTML頁面) – javram 2012-04-18 19:05:08

+0

需要檢查是否有任何重複的體積數存在於xml或不是 – 2012-04-18 19:07:10

回答

2

一幫這可以通過使用一個XPath表達式發現:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    Duplicate volume numbers exist: <xsl:text/> 

    <xsl:value-of select= 
    "false() 
    or 
    /*/*/*/RNumber 
      [@Type='VolumeNumber' 
      and 
      . = ../preceding-sibling::* 
        /RNumber[@Type='VolumeNumber'] 
      ] 
    "/> 

</xsl:template> 
</xsl:stylesheet> 

當這個變換所提供的XML文檔應用:

<BookList> 
    <Book> 
     <History> 
      <Type>history</Type> 
      <Prize>123</Prize> 
      <Publication>``  
       <Name>YEAP1</Name> 
      </Publication> 
      <RNumber Type="VolumeNumber">11111</RNumber> 
      <RNumber Type="SupplementNumber">123456</RNumber> 
     </History> 
     <chemistry> 
      <Type>chemistry</Type> 
      <Prize>333</Prize> 
      <Publication> 
       <Name>YEAP</Name> 
      </Publication> 
      <RNumber Type="VolumeNumber">11111</RNumber> 
      <RNumber Type="SupplementNumber">45454</RNumber> 
     </chemistry> 
     ......  
    </Book> 
</BookList> 

的希望,正確的結果產生:

Duplicate volume numbers exist: true 

II。使用溶液鍵(通常更有效):

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:key name="kVolNum" match="RNumber[@Type='VolumeNumber']" 
      use="."/> 

<xsl:template match="/"> 
    Duplicate volume numbers exist: <xsl:text/> 

    <xsl:value-of select= 
    "false() 
    or 
    /*/*/*/RNumber 
      [@Type='VolumeNumber' 
      and 
      key('kVolNum',.)[2] 
      ]"/> 

</xsl:template> 
</xsl:stylesheet> 

當這種轉化是在同一個XML文檔(以上)應用中,相同的正確的結果產生

Duplicate volume numbers exist: true 
+0

自2003/04/05以來的很長一段時間XSL名單 - 只是玩了十年後 - 如果我想要檢查是否有任何重複的' com.text1.text2'通過任何級別的XML文件,這仍然工作,或者我應該發佈一個新的問題? – 2017-05-15 18:18:46

+0

例如Here - http://stackoverflow.com/questions/43730689/find-matching-non-matching-elements-between-2-plist-xml-files – 2017-05-15 18:20:25