【问题标题】:how to check duplicate element values using xslt如何使用 xslt 检查重复的元素值
【发布时间】:2012-04-18 18:54:52
【问题描述】:
    <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。请帮忙解决这个问题

【问题讨论】:

  • 可能与以下内容重复:stackoverflow.com/questions/157705/…
  • 您是否只是想检查是否有重复项?预期的输出应该是什么样子? (即,显示哪些卷是重复的 html 页面?)
  • 需要检查xml中是否存在重复的volumnnumber

标签: xslt


【解决方案1】:

我。这可以使用单个 XPath 表达式找到

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

这是一个完整的 XSLT 转换,它评估这个 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

二。使用键的解决方案(通常更有效):

<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

【讨论】:

  • 自 2003 年 4 月 5 日以来在 XSL 列表上的很长时间 - 十年后才玩 - 如果我想通过任何级别的 XML 文件检查是否有 &lt;string&gt;com.text1.text2&lt;/string&gt; 的任何重复项,会这样吗?仍然工作还是我应该发布一个新问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 2017-04-14
  • 2017-06-19
相关资源
最近更新 更多