我正在尝试编写 XSLT 映射,以根据(关键字段名称)和(关键字段名称)段(MAT=IDEN)中的关键字段匹配将段移动到其相应的标题段,如果关键字段不匹配,则无需传递段,我已经编写了 XSLT,但它没有提供所需的转换。
我附上了以下示例输入和输出。请检查。
输入:
<?xml version="1.0" encoding="UTF-8"?>
<HEADER>
<CODI BEGIN="1">
<L20 SEGMENT="1">
<ELN>Value1</ELN>
<L24 SEGMENT="1">
<MAT>12345</MAT>
<field1>text </field1>
<ITEM SEGMENT="1">
<IDEN>12345</IDEN>
<Fields>00</Fields>
</ITEM>
<ITEM SEGMENT="1">
<IDEN>45678</IDEN>
<Fields>10</Fields>
</ITEM>
<ITEM SEGMENT="1">
<IDEN>45678</IDEN>
<Fields>11</Fields>
</ITEM>
<ITEM SEGMENT="1">
<IDEN>667788</IDEN>
<Fields>12</Fields>
</ITEM>
<ITEM SEGMENT="1">
<IDEN>667788</IDEN>
<Fields>13</Fields>
</ITEM>
<ITEM SEGMENT="1">
<IDEN>112233</IDEN>
<Fields>20</Fields>
</ITEM>
<L19 SEGMENT="1">
<LF>Value2</LF>
</L19>
</L24>
<L24 SEGMENT="1">
<MAT>45678</MAT>
<field1>text1 </field1>
<L19 SEGMENT="1">
<LF>Value2</LF>
</L19>
</L24>
<L24 SEGMENT="1">
<MAT>60987</MAT>
<field1>text2 </field1>
<L19 SEGMENT="1">
<LF>Value2</LF>
</L19>
</L24>
<L24 SEGMENT="1">
<MAT>667788</MAT>
<field1>text3 </field1>
<L19 SEGMENT="1">
<LF>Value2</LF>
</L19>
</L24>
<L24 SEGMENT="1">
<MAT>112233</MAT>
<field1>text4 </field1>
<L19 SEGMENT="1">
<LF>Value2</LF>
</L19>
</L24>
</L20>
</CODI>
</HEADER>
** 期望输出:**
<?xml version="1.0" encoding="UTF-8"?>
<HEADER>
<CODI BEGIN="1">
<L20 SEGMENT="1">
<ELN>Value1</ELN>
<L24 SEGMENT="1">
<MAT>12345</MAT>
<field1>text </field1>
<ITEM SEGMENT="1">
<IDEN>12345</IDEN>
<Fields>00</Fields>
</ITEM>
<L19 SEGMENT="1">
<LF>Value2</LF>
</L19>
</L24>
<L24 SEGMENT="1">
<MAT>45678</MAT>
<field1>text1 </field1>
<ITEM SEGMENT="1">
<IDEN>45678</IDEN>
<Fields>10</Fields>
</ITEM>
<ITEM SEGMENT="1">
<IDEN>45678</IDEN>
<Fields>11</Fields>
</ITEM>
<L19 SEGMENT="1">
<LF>Value2</LF>
</L19>
</L24>
<L24 SEGMENT="1">
<MAT>60987</MAT>
<field1>text2 </field1>
<L19 SEGMENT="1">
<LF>Value2</LF>
</L19>
</L24>
<L24 SEGMENT="1">
<MAT>667788</MAT>
<field1>text3 </field1>
<ITEM SEGMENT="1">
<IDEN>667788</IDEN>
<Fields>12</Fields>
</ITEM>
<ITEM SEGMENT="1">
<IDEN>667788</IDEN>
<Fields>13</Fields>
</ITEM>
<L19 SEGMENT="1">
<LF>Value2</LF>
</L19>
</L24>
<L24 SEGMENT="1">
<MAT>112233</MAT>
<field1>text4 </field1>
<ITEM SEGMENT="1">
<IDEN>112233</IDEN>
<Fields>20</Fields>
</ITEM>
<L19 SEGMENT="1">
<LF>Value2</LF>
</L19>
</L24>
</L20>
</CODI>
</HEADER>
** 我使用的 XSLT 如下:**
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="IDEN-by-key" match="//ITEM" use="@IDEN" />
<!-- Identity template to copy all nodes as-is -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//L24">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
<xsl:for-each select="('IDEN-by-key', @IDEN)">
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
请在此提供帮助。
正如评论中指出的那样,对于您来说,
xsl:key
您想使用IDEN
元素,而不是属性。此外,当您尝试使用它时,@IDEN
您的 XSLT 丢失了。key()
由于您想要替换所有的
ITEM
和 替换为与值匹配的替换MAT
,并将它们放在输出中的元素ITEM
之后,我建议将 的副本移动到 的模板中并创建一个空的模板。此外,您不需要使用,您只需key() //`:MAT
ITEM
MAT
ITEM
xsl:for-each
xsl:copy-of and select from the
, and your match expressions don't need
由于您已经更新了问题并更改了输入,如果您想确保 ITEM 在 L19 元素之前生成,请更改您锚定到的模板,但概念相同: