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

2つのキーを使用してデータを検索できます。まず、E1BPBUSISM008_ITEM_AD_OUT要素をITEM_NUMBERで検索します

<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 に答える