如何在 XSLT 中根据条件更改硬编码元素的位置?

How to change position of hardcoded elements on condition in XSLT?

我正在编写一个模板并调用该特定模板,我正在对一些新元素进行硬编码,我希望我的 xslt 中的这些硬编码元素按照我想要的输出中所示的顺序显示在结果输出中以下。这个条件怎么写?

这是我的输入请求:

<companies>
  <company>
    <locations>
      <location>
        <ID>1</ID>
        <empdetails>
          <empdetail>
            <x>A</x>
            <y>B</y>
          </empdetail>
        </empdetails>
        <empdetails>
          <empdetail>
            <x>A1</x>
            <y>B1</y>
          </empdetail>
        </empdetails>     
      </location>
    </locations>
    <locations>
      <location>
        <ID>2</ID>
        <empdetails>
          <empdetail>
            <x>A2</x>
            <y>B2</y>
          </empdetail>
        </empdetails>
        <empdetails>
          <empdetail>
            <x>A3</x>
            <y>B3</y>
          </empdetail>
        </empdetails>
      </location>
    </locations>
  </company>
</companies>

这是所需的输出:

<employeeinfo>
  <employees>
    <employee>
      <ID>1</ID>
      <details>
        <detail>
          <A>A</A>
          <B>B</B>
        </detail>
      </details>
      <details>
        <detail>
          <A>A1</A>
          <B>B1</B>
        </detail>
      </details>
    </employee>
  </employees>
  <employees>
    <employee>
      <ID>2</ID>
      <details>
        <detail>
          <A>A2</A>
          <B>B2</B>
        </detail>
      </details>
      <details>
        <detail>
          <A>A3</A>
          <B>B3</B>
        </detail>
      </details>
    </employee>
  </employees>
</employeeinfo>

我得到的输出:

    <employeeinfo>
    <employees>
    <employee>
      <ID>1</ID>
      <details>
      <detail>
        <A>A</A>
        <B>B</B>
     </detail>
    </details>
    </employee>
    </employees>
    <employees>
    <employee>
     <ID>1</ID>
    <details>
      <detail>
        <A>A1</A>
        <B>B1</B>
     </detail>
    </details>
    </employee>
    </employees>
    <employees>
    <employee>
     <ID>2</ID>
    <details>
      <detail>
        <A>A2</A>
        <B>B2</B>
     </detail>
    </details>
    </employee>
    </employees>
    <employees>
    <employee>
     <ID>2</ID>
    <details>
      <detail>
        <A>A3</A>
        <B>B3</B>
     </detail>
    </details>
    </employee>
    </employees>
    </employeeinfo>

这就是我编写 XSLT 的方式:

<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" 
    indent="yes"/>
  <xsl:strip-space elements="*"/>
  <xsl:template match="companies">
    <employeeinfo>  
      <employees>
        <xsl:for-each select="//*[local-name()=locations]/*[local-name()=location]/*[local-name()=empdetails]">
          <xsl:call-template name="locations">
            <xsl:with-param name="employee" select="."/>
            
          </xsl:call-template>
        </xsl:for-each>
      </employees>
    </employeeinfo>
  </xsl:template>
  <xsl:template name="locations">
    <xsl:param name="employee"/>
    <xsl:variable name="A" select=".//empdetail/x"/>
    <xsl:variable name="B" select=".//empdetail/y"/>
    <xsl:variable name="C" select="../locations/ID"/>
    <employee>
      <ID>
        <xsl:value-of select="$C"/>
      </ID>
      <details>
        <detail>
          <A>
            <xsl:value-of select="$A"/>
          </A>
          <B>
            <xsl:value-of select="$B"/>
          </B>
        </detail>
      </details>
    </employee>
  </xsl:template>
</xsl:stylesheet>

我想你几乎想要一对一的映射,只跳过一个元素:

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

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

<xsl:template match="companies">
    <employeeinfo>
        <xsl:apply-templates/>
    </employeeinfo>
</xsl:template>

<xsl:template match="company">
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="locations">
    <employees>
        <xsl:apply-templates/>
    </employees>
</xsl:template>

<xsl:template match="location">
    <employee>
        <xsl:apply-templates/>
    </employee>
</xsl:template>

<xsl:template match="empdetails">
    <details>
        <xsl:apply-templates/>
    </details>
</xsl:template>

<xsl:template match="empdetail">
    <detail>
        <xsl:apply-templates/>
    </detail>
</xsl:template>

<xsl:template match="x">
    <A>
        <xsl:apply-templates/>
    </A>
</xsl:template>

<xsl:template match="y">
    <B>
        <xsl:apply-templates/>
    </B>
</xsl:template>

</xsl:stylesheet>