有没有办法使用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 :(得分: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" />