嵌套 xsl 模板并将多个模板引用到同一节点?

2024-01-18

这是我的第一篇文章 :)

我会尽力表达清楚和友好,提前感谢您的帮助!我很抱歉这个问题很复杂。 :|任何有关如何更好地提出问题的友好提示也将不胜感激!

这是我拥有的 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(使用前将#替换为@)

嵌套 xsl 模板并将多个模板引用到同一节点? 的相关文章

随机推荐