2012-07-04 41 views
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> 
+0

亞歷山大Stzhalkovski:您目前接受的答案與提交的最佳答案 - @TimC所提供的答案不一樣好。 –

回答

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(假定一個根元素是存在的),下面是輸出

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

+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" />