在新节点下移动节点的问题

Issue in moving nodes under new node

我在重新排列给定输出结构中的节点时遇到问题。 Company1Company2Company 3 是静态的。这些不会改变。所以我需要 SCompany 列表中的三个。

Company4Company5 是动态的,因为其中一个或两个都可以出现在 NCompany 列表中。

我需要在 SCompany 下形成文本 A1B2C3 的节点。如果 A1 在除 <Given> <GivenId> 之外的任何节点下重复,我不需要那些。

也许我必须使用模式?

输入结构

<root>  
  <Given>
    <GivenId>testchecki</GivenId>
  </Given>
  <Given>
    <GivenId>STOP</GivenId>
    <List>
      <ValueGiven>100000</ValueGiven>
    </List>
  </Given> 
  <Given>
    <GivenId>A1</GivenId>
    <List id="Same">
      <ValueGiven>50000</ValueGiven>
    </List>
    <List id="Different">
      <ValueGiven>200000</ValueGiven>
    </List>
  </Given>
  <Given>
    <GivenId>B2</GivenId>
    <List id="Same">
      <ValueGiven>500001</ValueGiven>
    </List>
    <List id="Different">
      <ValueGiven>3000001</ValueGiven>
    </List>
  </Given>
  <Given>
    <GivenId>C3</GivenId>
    <List id="Same">
      <ValueGiven>500002</ValueGiven>
    </List>
    <List id="Different">
      <ValueGiven>3000002</ValueGiven>
    </List>
  </Given>

  <Given>
    <GivenId>F4</GivenId>
    <Change>EX</Change>
    <List id="Same">
      <ValueGiven>500003</ValueGiven>
    </List>
    <List id="Different">
      <ValueGiven>3000003</ValueGiven>
    </List>
  </Given>
  <Given>
    <GivenId>G5</GivenId>
    <Change>Eptest</Change>
    <List id="Same">
      <ValueGiven>10000004</ValueGiven>
    </List>
    <List id="Different">
      <ValueGiven>2000004</ValueGiven>
    </List>
  </Given>
</root>

输出结构

<root>
  <Scompany>
    <A1>
      <GivenId></GivenId>
      <Same></Same>
      <Different></Different>
    </A1>
    <B2>
      <GivenId></GivenId>
      <Same></Same>
      <Different></Different>
    </B2>
    <C3>
      <GivenId></GivenId>
      <Same></Same>
      <Different></Different>
    </C3>
  </Scompany>
  <Ncompany>
    <F4>
      <GivenId></GivenId>
      <Same></Same>
      <Different></Different>
    </F4>
 </Ncompany>
 <Ncompany>
    <G5>
      <GivenId></GivenId>
      <Same></Same>
      <Different></Different>
    </G5>
  </Ncompany>
</root>
<?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="xml" indent="yes"/>

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

  <xsl:template match="root/Given">
    <xsl:if test="position()=6 or position()=7">
      <NCompany>
        <xsl:apply-templates mode="check"></xsl:apply-templates>
      </NCompany>
    </xsl:if>
    <xsl:if test="position()=3 or position()=4 or position()=5">
      <xsl:apply-templates mode="test"></xsl:apply-templates>
    </xsl:if>
  </xsl:template>
  <xsl:template match="root/Given" mode="test">


    <xsl:if test="Given/text()='A1'">
      <xsl:element name="{concat(name(), position())}">

        <xsl:copy>
          <xsl:apply-templates select="node()"/>
        </xsl:copy>
      </xsl:element>
    </xsl:if>

    <xsl:if test="Given/text()='B2'">
      <xsl:element name="{concat(name(), position())}">

        <xsl:apply-templates select="node()"/>
      </xsl:element>
    </xsl:if>

    <xsl:if test="Given/text()='C3'">
      <xsl:element name="{concat(name(), position())}">

        <xsl:apply-templates select="node()"/>
      </xsl:element>
    </xsl:if>

  </xsl:template>

  <xsl:template match="root/Given" mode="check">

    <xsl:if test="position()=6 or position()=7">
      <xsl:element name="{concat(name(), position())}">

        <xsl:apply-templates select="node()"/>
      </xsl:element>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

这是基本思路。您需要对其进行调整以满足您未记录的要求。

<xsl:template match="root">
  <xsl:copy>
    <xsl:element name="Scompany">
      <!-- Select the Given nodes that should be in Scompany. Ensure only one Given per GivenId is selected. -->
      <xsl:apply-templates select="Given[GivenId = 'A1'][1]|Given[GivenId = 'B2'][1]|Given[GivenId = 'C3'][1]"/>
    </xsl:element>
    <xsl:element name="Ncompany">
      <!-- Select the given nodes that should be in Ncompany. Ensure only one Given per GivenId is selected.-->
      <xsl:apply-templates select="Given[GivenId = 'F4'][1]|Given[GivenId = 'G5'][1]"/>
    </xsl:element>
  </xsl:copy>
</xsl:template>

<xsl:template match="Given">
  <xsl:element name="{GivenId}">
    <xsl:apply-templates select="node()"/>
  </xsl:element>
</xsl:template>

<xsl:template match="GivenId">
  <xsl:copy>
  </xsl:copy>
</xsl:template>

<xsl:template match="List">
  <xsl:choose>
    <xsl:when test="@id='Same'">
      <xsl:element name="Same">
      </xsl:element>
    </xsl:when>    
    <xsl:when test="@id='Different'">
      <xsl:element name="Different">
      </xsl:element>
    </xsl:when>    
  </xsl:choose>
</xsl:template>

<xsl:template match="Change"/>

<!-- This is the bottom -->