1

有没有办法使用 XSLT 1.0 将 xml1 转换为 xml2?

xml1

<E1BPBUSISM008_ITEM_OUT>
    <ITEM_NUMBER>010</ITEM_NUMBER>
</E1BPBUSISM008_ITEM_OUT>
<E1BPBUSISM008_ITEM_OUT>
    <ITEM_NUMBER>020</ITEM_NUMBER>
</E1BPBUSISM008_ITEM_OUT>

<E1BPBUSISM008_ITEM_AD_OUT>
    <ITEM_NUMBER>010</ITEM_NUMBER>
    <AD_SPEC_NO>000001</AD_SPEC_NO>
</E1BPBUSISM008_ITEM_AD_OUT>
<E1BPBUSISM008_ITEM_AD_OUT>
    <ITEM_NUMBER>020</ITEM_NUMBER>
    <AD_SPEC_NO>000002</AD_SPEC_NO>
</E1BPBUSISM008_ITEM_AD_OUT>

<E1BPBUSISM008_AD_SPEC_AD_OU>
    <AD_SPEC_NO>000001</AD_SPEC_NO>
    <KEYWORD>key1</KEYWORD>
</E1BPBUSISM008_AD_SPEC_AD_OU>
<E1BPBUSISM008_AD_SPEC_AD_OU>
    <AD_SPEC_NO>000002</AD_SPEC_NO>
    <KEYWORD>key2</KEYWORD>
</E1BPBUSISM008_AD_SPEC_AD_OU>

进入xml2

<Ad>
    <ad-number>010</ad-number>
    <keyword>key1</keyword>
</Ad>
<Ad>
    <ad-number>020</ad-number>
    <keyword>key2</keyword>
</Ad>

如果无法进行直接转换,则将xml1合并为以下内容会有所帮助:

<E1BPBUSISM008_ITEM_OUT>
    <ITEM_NUMBER>010</ITEM_NUMBER>
    <KEYWORD>key1</KEYWORD>
</E1BPBUSISM008_ITEM_OUT>
<E1BPBUSISM008_ITEM_OUT>
    <ITEM_NUMBER>020</ITEM_NUMBER>
    <KEYWORD>key2</KEYWORD>
</E1BPBUSISM008_ITEM_OUT>
4

2 回答 2

2

您可以使用两个键来查找数据。首先通过ITEM_NUMBER查找E1BPBUSISM008_ITEM_AD_OUT元素

<xsl:key name="ad1" match="E1BPBUSISM008_ITEM_AD_OUT" use="ITEM_NUMBER" />

然后通过AD_SPEC_NO查找E1BPBUSISM008_AD_SPEC_AD_OU元素

<xsl:key name="ad2" match="E1BPBUSISM008_AD_SPEC_AD_OU" use="AD_SPEC_NO" />

然后,对于给定的E1BPBUSISM008_ITEM_OUT元素,你会得到这样的关键字

<xsl:value-of select="key('ad2', key('ad1', ITEM_NUMBER)/AD_SPEC_NO)/KEYWORD" />

因此,给定以下 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>
   <xsl:key name="ad1" match="E1BPBUSISM008_ITEM_AD_OUT" use="ITEM_NUMBER" />
   <xsl:key name="ad2" match="E1BPBUSISM008_AD_SPEC_AD_OU" use="AD_SPEC_NO" />

   <xsl:template match="/ROOT">
      <xsl:apply-templates select="E1BPBUSISM008_ITEM_OUT" />
   </xsl:template>

   <xsl:template match="E1BPBUSISM008_ITEM_OUT">
      <Ad>
         <ad-number><xsl:value-of select="ITEM_NUMBER" /></ad-number>
         <keyword><xsl:value-of select="key('ad2', key('ad1', ITEM_NUMBER)/AD_SPEC_NO)/KEYWORD" /></keyword>
      </Ad>
   </xsl:template>
</xsl:stylesheet>

当应用于您的 XML 时(假设存在 ROOT 元素),输出以下内容

<Ad>
    <ad-number>010</ad-number>
    <keyword>key1</keyword>
</Ad>
<Ad>
    <ad-number>020</ad-number>
    <keyword>key2</keyword>
</Ad>
于 2012-07-04T13:54:42.413 回答
1

这只是一个建议,因为我现在无法进行任何测试。

使用密钥按 ITEM_NUMBER 获取您的 AD_SPEC_NO:

  <xsl:key name="AD_SPEC_NO" match="E1BPBUSISM008_ITEM_AD_OUT" use="ITEM_NUMBER"/>

然后,例如,在匹配 E1BPBUSISM008_ITEM_OUT 的模板中,您可以使用以下表达式来获取相关关键字值:

  <xsl:value-of select="following-sibling::E1BPBUSISM008_AD_SPEC_AD_OU[
       AD_SPEC_NO = key('AD_SPEC_NO',current()/ITEM_NUMBER)/AD_SPEC_NO]
       /KEYWORD" />
于 2012-07-04T13:03:47.957 回答