这是我的第一篇文章 :)
我会尽力表达清楚和友好,提前感谢您的帮助!我很抱歉这个问题很复杂。 :|任何有关如何更好地提出问题的友好提示也将不胜感激!
这是我拥有的 xml 源文件的简化版本:
<?xml version="1.0" encoding="UTF-8"?>
<FMPDSORESULT xmlns="http://www.filemaker.com/fmpdsoresult">
<ERRORCODE>0</ERRORCODE>
<DATABASE>FTP XML.fmp12</DATABASE>
<LAYOUT>
</LAYOUT>
<ROW MODID="0" RECORDID="1151">
<EDI_DC40.TABNAM><DATA>EDI_DC40</DATA></EDI_DC40.TABNAM>
<E1EDL20.VBELN><DATA>some value</DATA></E1EDL20.VBELN>
<E1EDL18.QUALF><DATA>data</DATA></E1EDL18.QUALF>
<E1EDT13.1.QUALF><DATA>123<DATA></E1EDT13.1.QUALF>
<E1EDT13.2.QUALF><DATA></DATA></E1EDT13.2.QUALF>
<E1EDL24.POSNR>000001</E1EDL24.POSNR>
<E1EDL41.QUALI>001</E1EDL41.QUALI>
<E1EDL37.EXIDV><DATA></DATA></E1EDL37.EXIDV>
<E1EDL44.VELIN></E1EDL44.VELIN>
<E1EDL44.POSNR></E1EDL44.POSNR>
</ROW>
<ROW MODID="0" RECORDID="1176">
<EDI_DC40.TABNAM><DATA>EDI_DC40</DATA></EDI_DC40.TABNAM>
<E1EDL20.VBELN><DATA>vvvv</DATA></E1EDL20.VBELN>
<E1EDL18.QUALF><DATA>20</DATA></E1EDL18.QUALF>
<E1EDT13.1.QUALF><DATA>20</DATA></E1EDT13.1.QUALF>
<E1EDT13.2.QUALF><DATA>30</DATA></E1EDT13.2.QUALF>
<E1EDL24.POSNR>000001</E1EDL24.POSNR>
<E1EDL41.QUALI>001</E1EDL41.QUALI>
<E1EDL37.EXIDV><DATA>eee</DATA></E1EDL37.EXIDV>
<E1EDL44.VELIN>
<DATA>1</DATA>
<DATA>1</DATA>
<DATA>1</DATA>
</E1EDL44.VELIN>
<E1EDL44.POSNR>
<DATA>000001</DATA>
<DATA>000002</DATA>
<DATA>000003</DATA>
</E1EDL44.POSNR>
</ROW>
<ROW MODID="0" RECORDID="1177">
<EDI_DC40.TABNAM><DATA>EDI_DC40</DATA></EDI_DC40.TABNAM>
<EDI_DC40.MANDT><DATA>100</DATA></EDI_DC40.MANDT>
<E1EDL20.VBELN><DATA>vvvv</DATA></E1EDL20.VBELN>
<E1EDL18.QUALF><DATA>20</DATA></E1EDL18.QUALF>
<E1EDT13.1.QUALF><DATA>20</DATA></E1EDT13.1.QUALF>
<E1EDT13.2.QUALF><DATA>30</DATA></E1EDT13.2.QUALF>
<E1EDL24.POSNR>000002</E1EDL24.POSNR>
<E1EDL41.QUALI>001</E1EDL41.QUALI>
<E1EDL37.EXIDV><DATA>eee</DATA></E1EDL37.EXIDV>
<E1EDL44.VELIN>
<DATA>1</DATA>
<DATA>1</DATA>
<DATA>1</DATA>
</E1EDL44.VELIN>
<E1EDL44.POSNR>
<DATA>000001</DATA>
<DATA>000002</DATA>
<DATA>000003</DATA>
</E1EDL44.POSNR>
</ROW>
</FMPDSORESULT>
这是所需的结果 xml 结构(抱歉,数据不一样,但标签名称大多相似):
<?xml version="1.0" encoding="utf-8"?>
<DELVRY05>
<IDOC BEGIN="1">
<EDI_DC40 SEGMENT="1">
<TABNAM>EDI-DC40</TABNAM>
...
</EDI_DC40>
<E1EDL20 SEGMENT="1">
<VBELN>649758</VBELN>
...
<E1EDL18 SEGMENT="1">
<QUALF>ORI</QUALF>
</E1EDL18>
<E1EDT13 SEGMENT="1">
<QUALF>007</QUALF>
...
</E1EDT13>
<E1EDT13 SEGMENT="1">
<QUALF>015</QUALF>
...
</E1EDT13>
<E1EDL24 SEGMENT="1">
<POSNR>000001</POSNR>
...
<E1EDL41 SEGMENT="1">
<QUALI>001</QUALI>
...
</E1EDL41>
</E1EDL24>
<E1EDL24 SEGMENT="1">
<POSNR>2</POSNR>
...
<E1EDL41 SEGMENT="1">
<QUALI>001</QUALI>
...
</E1EDL41>
</E1EDL24>
<E1EDL24 SEGMENT="1">
<POSNR>000003</POSNR>
...
<GEWWI>KGM</GEWWI>
<E1EDL41 SEGMENT="1">
<QUALI>001</QUALI>
...
</E1EDL41>
</E1EDL24>
<E1EDL24 SEGMENT="1">
<POSNR>000004</POSNR>
...
<E1EDL41 SEGMENT="1">
<QUALI>001</QUALI>
<BSTNR>4506192685</BSTNR>
<POSEX>00040</POSEX>
</E1EDL41>
</E1EDL24>
<E1EDL37 SEGMENT="1">
<EXIDV>5650327422</EXIDV>
...
<EXIDA>H</EXIDA>
<E1EDL44 SEGMENT="1">
<VELIN>1</VELIN>
<POSNR>000001</POSNR>
...
</E1EDL44>
<E1EDL44 SEGMENT="1">
<VELIN>1</VELIN>
<POSNR>000002</POSNR>
...
</E1EDL44>
<E1EDL44 SEGMENT="1">
<VELIN>1</VELIN>
<POSNR>000003</POSNR>
...
</E1EDL44>
<E1EDL44 SEGMENT="1">
<VELIN>1</VELIN>
<POSNR>000004</POSNR>
...
</E1EDL44>
</E1EDL37>
</E1EDL20>
</IDOC>
</DELVRY05>
这就是有问题的 xsl 的要点,让我很痛苦:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fm="http://www.filemaker.com/fmpdsoresult" exclude-result-prefixes="fm">
<xsl:output method="xml" indent="yes"/>
<xsl:variable name="rename">
<item from="EDI_DC40.TABNAM" to="TABNAM" />
<item from="E1EDL20.VBELN" to="VBELN" />
<item from="E1EDL18.QUALF" to="QUALF" />
<item from="E1EDT13.1.QUALF" to="QUALF" />
<item from="E1EDT13.2.QUALF" to="QUALF" />
<item from="E1EDL24.POSNR" to="POSNR" />
<item from="E1EDL41.QUALF" to="QUALF" />
<item from="E1EDL37.EXIDV" to="EXIDV" />
<item from="E1EDL44.VELIN" to="VELIN" />
</xsl:variable>
<xsl:template match="/*">
<DELVRY05>
<IDOC BEGIN="1">
<xsl:apply-templates select="fm:ROW"/>
</IDOC>
</DELVRY05>
</xsl:template>
<xsl:template name="headers" match="fm:ROW[1]">
<EDI_DC40 SEGMENT="1">
<xsl:apply-templates select="fm:EDI_DC40.TABNAM" mode="rename" />
</EDI_DC40>
<E1EDL20 SEGMENT="1">
<xsl:apply-templates select="fm:E1EDL20.VBELN" mode="rename" />
<E1EDL18 SEGMENT="1">
<xsl:apply-templates select="fm:E1EDL18.QUALF" mode="rename" />
</E1EDL18>
<E1EDT13 SEGMENT="1">
<xsl:apply-templates select="fm:E1EDT13.1.QUALF" mode="rename" />
</E1EDT13>
<E1EDT13 SEGMENT="1">
<xsl:apply-templates select="fm:E1EDT13.2.QUALF" mode="rename" />
</E1EDT13>
<E1EDL24 SEGMENT="1">
<xsl:apply-templates select="fm:E1EDL24.POSNR" mode="rename" />
<E1EDL41 SEGMENT="1">
<xsl:apply-templates select="fm:E1EDL41.QUALF" mode="rename" />
</E1EDL41>
<!-- <xsl:apply-templates select="fm:ROW"/> -->
<xsl:apply-templates select="lines"/>
</E1EDL37>
<E1EDL37 SEGMENT="1">
<xsl:apply-templates select="fm:E1EDL37.EXIDV" mode="rename" />
<E1EDL44 SEGMENT="1">
<!-- This I don't have the slightest clue how to solve, since the structure in the XML is similar to an array -->
<xsl:apply-templates select="fm:E1EDL44.QUALF[1] | fm:E1EDL44.POSNR[1]" mode="rename" />
</E1EDL44>
</E1EDL37>
</E1EDL20>
</xsl:template>
<xsl:template name="lines" match="fm:ROW">
<E1EDL41 SEGMENT="1">
<xsl:apply-templates select="fm:E1EDL41.QUALF | fm:E1EDL41.MATNR" mode="rename" />
</E1EDL41>
</xsl:template>
<xsl:template name="packaging" match="fm:ROW">
<E1EDL44 SEGMENT="1">
<xsl:apply-templates select="fm:E1EDL44.QUALF | fm:E1EDL44.POSNR" mode="rename" />
</E1EDL44>
</xsl:template>
<xsl:template match="*" mode="rename">
<xsl:element name="{document('')//xsl:variable[@name = 'rename']/item[@from = local-name(current())]/@to}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
正如你所看到的,我有几个问题:
-
我认为我需要以某种方式嵌套模板,但这并没有给出所需的结果(嵌套模板在标签 E1EDL20 关闭后错误地显示)。我怎样才能正确地做到这一点?
-
我可以对 E1EDL44 标签中的“数组”数据使用什么模板匹配?
-
正如在 xsl 中清楚地看到的那样,唯一标识符的匹配问题是一个问题,因为我必须嵌套此结构(我知道我不应该这样做,但我不知道如何实现此结构):
<DELVRY05>
<IDOC BEGIN="1">
<EDI_DC40 SEGMENT="1">
<!-- header data unique tags - template on first ROW -->
</EDI_DC40>
<E1EDL20 SEGMENT="1">
<!-- more header data unique tags, this has to be done seperate, because of the container tag, I assume 2 nd template on the first ROW -->
<E1EDL24 SEGMENT="1">
<!-- line data tags; random n, corresponds to the ROWS in the source file -->
</E1EDL24>
<E1EDL37 SEGMENT="1">
<!-- again header data unique tags -->
<E1EDL44 SEGMENT="1">
<!-- 'arrayed' data, random n lines, I don't even know how to do this one! It should also only appear one time, only for the first line ( so I thought this would need a third template on the first ROW -->
</E1EDL44>
</E1EDL37>
</E1EDL20>
</IDOC>
</DELVRY05>
如何将 E1EDL44 嵌套在其中?
请帮我!
非常感谢您提供的每一个帮助或引导我走向正确的方向。
汤姆
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)