【问题标题】:Merging elements that do not have direct references合并没有直接引用的元素
【发布时间】:2012-07-04 23:14:04
【问题描述】:

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

【问题讨论】:

  • Aleksandr Stzhalkovski:您目前接受的答案不如提交的最佳答案——@TimC 提供的最佳答案。

标签: xml xslt xslt-1.0


【解决方案1】:

您可以使用两个键来查找数据。首先通过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 元素,您会得到 keyword 像这样

<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>

【讨论】:

    【解决方案2】:

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

    使用密钥按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" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 2018-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多