【发布时间】:2020-01-25 03:46:59
【问题描述】:
我有一个如下所示的 XML:
<request>
<MaterialOrderItems>
<Item>
<LineId>1</LineId>
<ParentLineId>1</ParentLineId>
</Item>
<Item>
<LineId>2</LineId>
<ParentLineId>1</ParentLineId>
</Item>
<Item>
<LineId>3</LineId>
<ParentLineId>1</ParentLineId>
</Item>
</MaterialOrderItems>
</request>
我想获取此 XML,并将此项目组 (Item[1,2,3]) 复制为多个副本。例如,如果我想要 2 个副本,我的最终 xml 将如下所示:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<request>
<MaterialOrderItems>
<Item>
<LineId>1</LineId>
<ParentLineId>1</ParentLineId>
</Item>
<Item>
<LineId>2</LineId>
<ParentLineId>1</ParentLineId>
</Item>
<Item>
<LineId>3</LineId>
<ParentLineId>1</ParentLineId>
</Item>
<Item>
<LineId>4</LineId>
<ParentLineId>4</ParentLineId>
</Item>
<Item>
<LineId>5</LineId>
<ParentLineId>4</ParentLineId>
</Item>
<Item>
<LineId>6</LineId>
<ParentLineId>4</ParentLineId>
</Item>
</MaterialOrderItems>
</request>
我想出了这个 xslt 来做到这一点:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml" version="1.0">
<xsl:output encoding="UTF-8" indent="yes" method="xml" standalone="no"
omit-xml-declaration="no"/>
<xsl:param name="nmaterials" select="2" />
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//MaterialOrderItems" name="order">
<xsl:param name="material_number" select="1" />
<xsl:copy>
<Item>
<LineId><xsl:value-of select="((($material_number - 1) * 3) + 1)"/></LineId>
<ParentLineId><xsl:value-of select="((($material_number - 1) * 3) + 1)"/></ParentLineId>
</Item>
<Item>
<LineId><xsl:value-of select="((($material_number - 1) * 3) + 2)"/></LineId>
<ParentLineId><xsl:value-of select="((($material_number - 1) * 3) + 1)"/></ParentLineId>
</Item>
<Item>
<LineId><xsl:value-of select="((($material_number - 1) * 3) + 3)"/></LineId>
<ParentLineId><xsl:value-of select="((($material_number - 1) * 3) + 1)"/></ParentLineId>
</Item>
</xsl:copy>
<xsl:if test="$material_number < $nmaterials">
<xsl:apply-templates select=".">
<xsl:with-param name="material_number" select="$material_number + 1" />
</xsl:apply-templates>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
我得到了这个输出:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<request>
<MaterialOrderItems>
<Item>
<LineId>1</LineId>
<ParentLineId>1</ParentLineId>
</Item>
<Item>
<LineId>2</LineId>
<ParentLineId>1</ParentLineId>
</Item>
<Item>
<LineId>3</LineId>
<ParentLineId>1</ParentLineId>
</Item>
</MaterialOrderItems>
<MaterialOrderItems>
<Item>
<LineId>4</LineId>
<ParentLineId>4</ParentLineId>
</Item>
<Item>
<LineId>5</LineId>
<ParentLineId>4</ParentLineId>
</Item>
<Item>
<LineId>6</LineId>
<ParentLineId>4</ParentLineId>
</Item>
</MaterialOrderItems>
</request>
我有两个问题:
- 如何去掉重复的 MaterialOrderItems 节点?我只想要一次包含所有项目。
- 如何以更好的方式处理原始 xml?目前,我正在对我的 XSL 模板中的原始 xml 进行硬编码。应该有更好的方法来做到这一点。
请帮忙。
【问题讨论】: