我还在学习XSLT。我需要帮助将字段作为子项插入行项目节点。字段节点需要插入到前面发生的行项中。 有没有办法在 XSLT 1.0 中处理这个问题?即兄弟姐妹之前的 xpath 轴?
传入的 XML:
<Data>
<Data>
<Field1/>
<Field2/>
<Field3/>
<LineItem>
<LineItemNum>1</LineItemNum>
</LineItem>
<Field>
<HouseNumber/>
</Field>
<Field>
<HouseNumber/>
</Field>
<Field>
<HouseNumber/>
</Field>
<LineItem>
<LineItemNum>2</LineItemNum>
</LineItem>
<Field>
<HouseNumber/>
</Field>
<Field>
<HouseNumber/>
</Field>
<Field>
<HouseNumber/>
</Field>
</Data>
Output needed:
<Data>
<Data>
<Field1/>
<Field2/>
<Field3/>
<LineItem>
<LineItemNum>1</LineItemNum>
<Field>
<HouseNumber/>
</Field>
<Field>
<HouseNumber/>
</Field>
<Field>
<HouseNumber/>
</Field>
</LineItem>
<LineItem>
<LineItemNum>2</LineItemNum>
<Field>
<HouseNumber/>
</Field>
<Field>
<HouseNumber/>
</Field>
<Field>
<HouseNumber/>
</Field>
</LineItem>
</Data>
这远非微不足道,我不会推荐给初学者。请尝试以下方法:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="field-by-item" match="Field" use="generate-id(preceding-sibling::LineItem[1])" />
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Data/Data">
<xsl:copy>
<xsl:apply-templates select="*[not(self::Field)]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="LineItem">
<xsl:copy>
<xsl:apply-templates/>
<xsl:apply-templates select="key('field-by-item', generate-id())"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>