加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml – XSLT删除重复项

发布时间:2020-12-16 23:19:45 所属栏目:百科 来源:网络整理
导读:我有一个xml数据源,如下所示: dsQueryResponse Department Rows Row dept="HR" state="NY" region="East"/ Row dept="HR" state="NJ" region="East"/ Row dept="SD" state="NY" region="East"/ Row dept="MM" state="NY" region="East"/ Row dept="SD" stat
我有一个xml数据源,如下所示:

<dsQueryResponse>
  <Department>
    <Rows>
      <Row dept="HR" state="NY" region="East"/>
      <Row dept="HR" state="NJ" region="East"/>
      <Row dept="SD" state="NY" region="East"/>
      <Row dept="MM" state="NY" region="East"/>
      <Row dept="SD" state="NJ" region="East"/>
      <Row dept="SD" state="CO" region="West"/>
      <Row dept="MM" state="CO" region="West"/>
    </Rows>
  </Department>
</dsQueryResponse>

我的XSLT看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:output method="html" indent="no"/>
  <xsl:decimal-format NaN=""/>
  <xsl:param name="DeptQS">East</xsl:param>
  <xsl:variable name="deptRows" select="/dsQueryResponse/Department/Rows/Row[@region = $DeptQS]"/>

  <xsl:template match="/">
    <xsl:if test="count($deptRows) &gt; 0">
      <xsl:call-template name="deptList"/>
    </xsl:if>
  </xsl:template>

  <xsl:template name="deptList">
    <xsl:for-each select="$deptRows">
      <!-- process unique depts--> 
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

我希望将该地区的所有部门都写出来.我现在的代码将写出重复的部门.但是我怎么能只为该地区的部门写一次呢?

谢谢!

解决方法

对于XSLT 1.0,您可以使用“ Muenchian Method”.

您将创建一个键,通过@region和@dept值的组合来索引Row元素.

然后,您将获得该区域/部门组合的第一次出现(具有所需区域($DeptQS))并输出部门(部门).

这是一个示例样式表输出< test>显示上下文的元素:

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

  <xsl:key name="kDept" match="Department/Rows/Row" use="concat(@region,'|',@dept)"/>
  <xsl:param name="DeptQS">East</xsl:param>

  <xsl:template match="/*">
    <xsl:for-each select="Department/Rows/Row[count(.|key('kDept',concat($DeptQS,@dept))[1])=1]">
      <test>Current dept: <xsl:value-of select="@dept"/></test>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

这是使用输入XML的输出:

<test>Current dept: HR</test>
<test>Current dept: SD</test>
<test>Current dept: MM</test>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读