XSLT:删除重复项+设置顺序

问题描述 投票:0回答:1

我需要从 xml 中删除重复项+设置正确的序列,即 10、20、30 等。

我的xml:

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

<serviceInvocationRequests>
  <serviceInvocationRequest>
    <requests>
      <workCenter>04901</workCenter>
      <description>Some random description</description>
    <resourceMemberList>
        <resource>R4902A01</resource>
        <sequence>10</sequence>
      </resourceMemberList>
            <resourceMemberList>
        <resource>R4902A02</resource>
        <sequence>10</sequence>
      </resourceMemberList>
            <resourceMemberList>
        <resource>R4902A01</resource>
        <sequence>10</sequence>
      </resourceMemberList>
            <resourceMemberList>
        <resource>R4902A02</resource>
        <sequence>10</sequence>
      </resourceMemberList>
        </requests>
  </serviceInvocationRequest>
</serviceInvocationRequests>

我的用于删除重复项的 xslt: (目前适用于 1 个值(常见:资源),但可能我需要更多 - 这就是添加 concat 的原因)

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

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

    <xsl:key match="resourceMemberList" name="group-key" use="concat(resource, '|')"/>

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

    <xsl:template match="resourceMemberList[generate-id() = generate-id(key('group-key', concat(resource, '|'))[1])]">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="resourceMemberList"/>

</xsl:stylesheet>

删除重复项效果很好,但我需要将序列设置为 10 和 20

<?xml version="1.0" encoding="UTF-8"?>
<serviceInvocationRequests>
   <serviceInvocationRequest>
      <requests>
         <workCenter>04901</workCenter>
         <description>Some random description</description>
         <resourceMemberList>
            <resource>R4902A01</resource>
            <sequence>10</sequence>
         </resourceMemberList>
         <resourceMemberList>
            <resource>R4902A02</resource>
            <sequence>10</sequence>
         </resourceMemberList>
      </requests>
   </serviceInvocationRequest>
</serviceInvocationRequests>

我怎样才能实现这一目标? 当我尝试向 xslt 添加某些内容时,重复逻辑就会被破坏。 谢谢!

xslt duplicates sequence
1个回答
0
投票

我会用

xsl:number

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

  <xsl:key match="resourceMemberList" name="group-key" use="concat(resource, '|')"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
  
  <xsl:template match="sequence">
    <xsl:copy>
      <xsl:variable name="pos">
        <xsl:number count="resourceMemberList[generate-id() = generate-id(key('group-key', concat(resource, '|'))[1])]"/>
      </xsl:variable>
      <xsl:value-of select="10 * $pos"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="resourceMemberList[not(generate-id() = generate-id(key('group-key', concat(resource, '|'))[1]))]"/>

</xsl:stylesheet>
© www.soinside.com 2019 - 2024. All rights reserved.