合并没有直接引用的元素

时间:2012-07-04 12:36:53

标签: xml xslt xslt-1.0

有没有办法使用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>

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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" />