2012-04-18 93 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