我问了我的整个问题这里关于堆栈溢出 https://stackoverflow.com/questions/64966059/nesting-xsl-templates-and-referring-multiple-templates-to-the-same-node,我会尝试将其切碎:
我需要从这个源创建一个 xml:非常简单:
<?xml version="1.0" encoding="UTF-8"?>
<FMPDSORESULT xmlns="http://www.filemaker.com/fmpdsoresult">
<ROW>
<EDI_DC40.TABNAM><DATA>EDI_DC40</DATA></EDI_DC40.TABNAM>
<E1EDL20.VBELN><DATA>649758</DATA></E1EDL20.VBELN>
<E1EDL18.QUALF><DATA>ORI</DATA></E1EDL18.QUALF>
<E1EDT13.1.QUALF><DATA>007<DATA></E1EDT13.1.QUALF>
<E1EDT13.2.QUALF><DATA>015</DATA></E1EDT13.2.QUALF>
<E1EDL24.POSNR>000001</E1EDL24.POSNR>
<E1EDL24.POSNR>2</E1EDL24.POSNR>
(random number of these)
<E1EDL41.QUALI>001</E1EDL41.QUALI>
<E1EDL37.EXIDV><DATA>5650327422</DATA></E1EDL37.EXIDV>
<E1EDL44.POSNR>000001</E1EDL44.POSNR> <!--(these are the line items, equal to the number of ROW)-->
</ROW>
<ROW>...
这就是我需要的:
<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"> <!-- (random number of these, as commented above) -->
...
</E1EDL24>
</E1EDL20>
</IDOC>
</DELVRY05>
这是我对 xsl 的想法:
<xsl:template match="/*">
<DELVRY05>
<IDOC BEGIN="1">
<EDI_DC40 SEGMENT="1">
<xsl:apply-templates select="headers"/>
</EDI_DC40>
<E1EDL20 SEGMENT="1">
<xsl:apply-templates select="main"/>
<xsl:apply-templates select="fm:ROW"/>
</E1EDL20>
</IDOC>
</DELVRY05>
</xsl:template>
由于行和标题都包含在 E1EDL20 标记中,因此我认为需要两个模板,并且两者都引用源代码中的相同标记。正如规范所述,仅使用最后一个模板。 (所以它会看到“标题”和“行”,但看不到“主要”:
<xsl:template name="main" match="fm:ROW[1]"> ...
<xsl:template name="headers" match="fm:ROW[1]"> ...
<xsl:template name="lines" match="fm:ROW"> ...
我该如何解决这个问题?
Edit:
@塞巴斯蒂安:
您的解决方案非常适合我最初提供的源代码。很好的答案。然而,我在提供的代码中犯了一个错误,我深表歉意。
这是源代码的格式:
<?xml version="1.0" encoding="UTF-8"?>
<FMPDSORESULT xmlns="http://www.filemaker.com/fmpdsoresult">
<ROW>
<EDI_DC40.TABNAM><DATA>EDI_DC40</DATA></EDI_DC40.TABNAM>
<E1EDL20.VBELN><DATA>649758</DATA></E1EDL20.VBELN>
<E1EDL18.QUALF><DATA>ORI</DATA></E1EDL18.QUALF>
<E1EDT13.1.QUALF><DATA>007</DATA></E1EDT13.1.QUALF>
<E1EDT13.2.QUALF><DATA>015</DATA></E1EDT13.2.QUALF>
<E1EDL24.POSNR>000001</E1EDL24.POSNR>
<E1EDL41.QUALI>001</E1EDL41.QUALI>
<E1EDL37.EXIDV><DATA>5650327422</DATA></E1EDL37.EXIDV>
<E1EDL44.POSNR>000001</E1EDL44.POSNR>
</ROW>
<ROW>
<EDI_DC40.TABNAM><DATA>EDI_DC40</DATA></EDI_DC40.TABNAM>
<E1EDL20.VBELN><DATA>649758</DATA></E1EDL20.VBELN>
<E1EDL18.QUALF><DATA>ORI</DATA></E1EDL18.QUALF>
<E1EDT13.1.QUALF><DATA>007</DATA></E1EDT13.1.QUALF>
<E1EDT13.2.QUALF><DATA>015</DATA></E1EDT13.2.QUALF>
<E1EDL24.POSNR>2</E1EDL24.POSNR>
<E1EDL41.QUALI>002</E1EDL41.QUALI>
<E1EDL37.EXIDV><DATA>5650327422</DATA></E1EDL37.EXIDV>
<E1EDL44.POSNR>000001</E1EDL44.POSNR>
</ROW>
</FMPDSORESULT>
挑战在于我应该有一个带有标题的标签,但行项目应该在彼此之下列出,如下所示:
<?xml version="1.0" encoding="utf-16"?>
<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>
<E1EDL24 SEGMENT="1">
<POSNR>000001</POSNR>
<E1EDL41 SEGMENT="1">
<QUALI>001</QUALI>
</E1EDL41>
</E1EDL24>
<E1EDL24 SEGMENT="1">
<POSNR>2</POSNR>
<E1EDL41 SEGMENT="1">
<QUALI>002</QUALI>
</E1EDL41>
</E1EDL24>
</E1EDL20>
</IDOC>
</DELVRY05>
谢谢你对我的包容。我非常感谢你的帮助!
多谢,
汤姆