如果参考匹配,则生成元素值的所有组合

时间:2018-11-01 19:14:37

标签: xml xslt text xslt-2.0

我正在为结构不统一的XML苦苦挣扎。第一个<Report_Data>应该是第二个和第三个<Report_Data>的引用。因此,将发生以下情况:当GL_CodeCodePT-BU_Code相同时,必须复制它们的元素值。如果第一<Report_Data>的第二<Report_Data>和第三<RaaSData> <Report_Data xmlns:wd="urn:com.bsvc"> <Report_Entry> <PT-BU>A0003 SPL</PT-BU> <PT-BU_Code>A0003</PT-BU_Code> </Report_Entry> <Report_Entry> <PT-BU>CAN01 RIS</PT-BU> <PT-BU_Code>CAN01</PT-BU_Code> </Report_Entry> <Report_Entry> <PT-BU>NL001 REG</PT-BU> <PT-BU_Code>NL001</PT-BU_Code> </Report_Entry> <Report_Entry> <PT-BU>ZA009 CJH</PT-BU> <PT-BU_Code>ZA009</PT-BU_Code> </Report_Entry> </Report_Data> <Report_Data xmlns:wd="urn:com.bsvc"> <Report_Entry> <GL_Code>A0003</GL_Code> <Book_Code>G</Book_Code> </Report_Entry> <Report_Entry> <GL_Code>A0003</GL_Code> <Book_Code>L</Book_Code> </Report_Entry> <Report_Entry> <GL_Code>CAN01</GL_Code> <Book_Code>L</Book_Code> </Report_Entry> </Report_Data> <Report_Data xmlns:wd="urn:com.bsvc"> <Report_Entry> <Cost_Center>67902 CC</Cost_Center> <COMPANY> <Code>A0003</Code> </COMPANY> </Report_Entry> <Report_Entry> <Cost_Center>99999 CC</Cost_Center> <COMPANY> <Code>A0003</Code> </COMPANY> <COMPANY> <Code>NL001</Code> </COMPANY> </Report_Entry> </Report_Data> </RaaSData> 上没有其他详细信息,则这些条目必须保留。

PT-BU_Code

我不太确定如何启动XSLT,但这是我想要实现的输出示例(基于<Report_Data>的升序)。请注意,根据第二个和第三个Company;Code;Cost Center;Book Code A0003 SPL;A0003;67902 CC;G A0003 SPL;A0003;67902 CC;L A0003 SPL;A0003;99999 CC;G A0003 SPL;A0003;99999 CC;L CAN01 RIS;CAN01;;L NL001 REG;NL001;99999 CC; ZA009 CJH;ZA009;; 中给出的元素值,将生成新条目,并且所有条目都是唯一的。

class MyDd extends React.Component {
  state = {options: []}

  onSearchChange = (e, value) => {
    axios.get(`/api/match?query=${value.searchQuery}`)
     .then((response) => {
       this.setState({options: response.data})
    })

  }

  render() {
    return (
      <Dropdown
        onSearchChange={this.onSearchChange}
        search
        selection
        options={this.state.options}
      />
    )
  }
}

1 个答案:

答案 0 :(得分:0)

您可以使用按键查找公司并预订信息

<xsl:key name="book" match="Report_Entry" use="GL_Code" />
<xsl:key name="company" match="Report_Entry" use="COMPANY/Code" />

但是,这变得有些混乱,因为您需要检查您是否有一本书,但没有公司,或者一家公司却没有书,或者两者都不是。

尝试使用此XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" />

  <xsl:key name="book" match="Report_Entry" use="GL_Code" />
  <xsl:key name="company" match="Report_Entry" use="COMPANY/Code" />

  <xsl:template match="RaaSData">
    <xsl:text>Company;Code;Cost Center;Book Code&#10;</xsl:text>
    <xsl:for-each select="Report_Data[1]/Report_Entry">
      <xsl:variable name="bu" select="PT-BU_Code" />
      <xsl:variable name="prefix" select="concat(PT-BU, ';', $bu, ';')" />
      <xsl:for-each select="key('company', $bu)">
        <xsl:variable name="company" select="Cost_Center" />
        <xsl:for-each select="key('book', $bu)">
          <xsl:value-of select="concat($prefix, $company, ';', Book_Code, '&#10;')" />
        </xsl:for-each>
        <xsl:if test="not(key('book', $bu))">
          <xsl:value-of select="concat($prefix, $company, ';', '&#10;')" />
        </xsl:if>
      </xsl:for-each>
      <xsl:if test="not(key('company', $bu))">
        <xsl:for-each select="key('book', $bu)">
          <xsl:value-of select="concat($prefix, ';', Book_Code, '&#10;')" />
        </xsl:for-each>
        <xsl:if test="not(key('book', $bu))">
          <xsl:value-of select="concat($prefix, ';', '&#10;')" />
        </xsl:if>
      </xsl:if>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>