比较不同的订单项字段并使用 xslt2.0 映射相同 xml 中的值

Compare the different line item fields and map the value which is in the same xml using xslt2.0

下面一个是XML输入,

<?xml version="1.0" encoding="utf-8"?>
<GSK_Canonical_MESGX2>
 <header SEGMENT="1">
  <orderNumber>002001454979</orderNumber>
  <batchNumber>0000617944</batchNumber>
  <BOM SEGMENT="1">
   <operationNumber>0030</operationNumber>
   <phaseIndicator>0011</phaseIndicator>
  </BOM>
  <BOM SEGMENT="1">
   <operationNumber>0040</operationNumber>
   <phaseIndicator>0012</phaseIndicator>
  </BOM>
  <recipe SEGMENT="1">
   <phase>0011</phase>
   <parentOperation>0030</parentOperation>
   <workcenter>MANUOHD1</workcenter>
  </recipe>
  <recipe SEGMENT="1">
   <phase>0012</phase>
   <parentOperation>0040</parentOperation>
   <workcenter>COSTOHD1</workcenter>
  </recipe>
 </header>
</GSK_Canonical_MESGX2>

我有一个下面的 xslt,

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns:set="http://exslt.org/sets" xmlns:str="http://exslt.org/strings" xmlns:java="http://xml.apache.org/xslt/java" xmlns:saxon="http://saxon.sf.net/" exclude-result-prefixes="exsl set str java saxon">
 <xsl:output method="text"/>
 <xsl:variable name="VarHash" select="'#'"/>
 <xsl:variable name="VarBreak" select="'&#xa;'"/>
 <xsl:variable name="pipeFieldDelimiter" select="'\|'"/>
 <xsl:template match="/">
  <xsl:text>HEADER</xsl:text>
  <xsl:value-of select="$VarHash"/>
  <xsl:value-of select="GSK_Canonical_MESGX2/header/orderNumber"/>
  <xsl:value-of select="$VarHash"/>
  <xsl:value-of select="GSK_Canonical_MESGX2/header/batchNumber"/>
  <xsl:value-of select="$VarBreak"/>
  <xsl:for-each select="GSK_Canonical_MESGX2/header/BOM">
   <!--GSK_Canonical_MESGX2/Header/BOM/OperationNumber = GSK_Canonical_MESGX2/header/recipe/parentOperation and GSK_Canonical_MESGX2/Header/BOM/phaseIndicator = GSK_Canonical_MESGX2/header/recipe/phase then  <xsl:value-of select="GSK_Canonical_MESGX2/header/recipe/workcenter"/> This needs to be implemented for each line item of BOM tag  -->
   <xsl:if test="position() != last()">
    <xsl:value-of select="$VarBreak"/>
   </xsl:if>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

下面一个是预期的输出,

HEADER#002001454979#0000617944
MANUOHD1
COSTOHD1

现在需要对每个 BOM 行项目实施,如果条件满足,我们需要将 BOM 与 Recipe 标签和 select 工作中心值进行比较。

Header/BOM/OperationNumber = header/recipe/parentOperation 
  and 
Header/BOM/phaseIndicator = header/recipe/phase 
  then 
<xsl:value-of select="GSK_Canonical_MESGX2/header/recipe/workcenter"/>

请帮我实现this.Thanks

这个变换:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:key name="kBomByPhaseAndOperation" match="BOM"
  use="concat(operationNumber, '|', phaseIndicator)"/>

  <xsl:template match=
   "recipe[key('kBomByPhaseAndOperation',
               concat(parentOperation, '|', phase))
           ]">
    <xsl:value-of select="concat('&#xA;', workcenter)"/>
  </xsl:template>

  <xsl:template match="header">
    <xsl:text>HEADER</xsl:text>
    <xsl:apply-templates/>
  </xsl:template>
  <xsl:template match="orderNumber|batchNumber">
    <xsl:value-of select="concat('#', .)"/>
  </xsl:template>
  <xsl:template match="text()"/>
</xsl:stylesheet>

应用于提供的源 XML 文档时:

<GSK_Canonical_MESGX2>
    <header SEGMENT="1">
        <orderNumber>002001454979</orderNumber>
        <batchNumber>0000617944</batchNumber>
        <BOM SEGMENT="1">
            <operationNumber>0030</operationNumber>
            <phaseIndicator>0011</phaseIndicator>
        </BOM>
        <BOM SEGMENT="1">
            <operationNumber>0040</operationNumber>
            <phaseIndicator>0012</phaseIndicator>
        </BOM>
        <recipe SEGMENT="1">
            <phase>0011</phase>
            <parentOperation>0030</parentOperation>
            <workcenter>MANUOHD1</workcenter>
        </recipe>
        <recipe SEGMENT="1">
            <phase>0012</phase>
            <parentOperation>0040</parentOperation>
            <workcenter>COSTOHD1</workcenter>
        </recipe>
    </header>
</GSK_Canonical_MESGX2>

产生完全想要的正确结果:

HEADER#002001454979#0000617944
MANUOHD1
COSTOHD1