我对XLST相对较新,这可能是一个典型的初学者问题,但我无法弄清楚。希望你能帮助和理解我。提前谢谢你。:-)
我尝试将一个大的XML文件转换为另一个文件,但无法弄清楚如何获取第一个和最后一个节点并将它们与其他节点包围在一起。
问题是所有果节点都是迭代创建的。
在我看来,我应该在所有水果元素创建后添加周围的水果节点。
我已经尝试过类似的东西:
<xsl:template name="tplFruit" match="PARENT_FRUIT">
<xsl:apply-template select="(//element[@name='fruit'])[1]" />
</xsl:template>
<xsl:template name="addFruits">
<fruits>
</xsl:template>
<xsl:template name="tplFruit" match="PARENT_FRUIT">
<xsl:apply-template select="(//element[@name='fruit'])[last()]" />
</xsl:template>
<xsl:template name="addFruits">
</fruits>
</xsl:template>
但是它不起作用,我很确定会发生另一个错误,因为我在不同的模板中打开和关闭元素水果。
给出以下 xml (输入 - XML(:
<root>
... other elements ...
<PARENT_FRUIT>
<different_node nr="1" />
<different_node nr="2" />
<different_node nr="3" />
<fruit>
<name>Apple</name>
<calorien>999</calorien>
<color>red</color>
</fruit>
<fruit>
<name>cherry</name>
<calorien>999</calorien>
<color>red</color></fruit>
<fruit>
<name>banana</name>
<calorien>999</calorien>
<color>red</color>
</fruit>
<different_node nr="4" />
<different_node nr="5" />
<different_node nr="6" />
<fruit>
<name>Apple2</name>
<calorien>999</calorien>
<color>red</color>
</fruit>
<fruit>
<name>cherry2</name>
<calorien>999</calorien>
<color>red</color>
</fruit>
<fruit>
<name>banana2</name>
<calorien>999</calorien>
<color>red</color>
</fruit>
...and so on...
</PARENT_FRUIT>
...other elements ...
</root>
以下 XML 应该是我的最终结果:
<root>
... other elements ...
<PARENT_FRUIT>
... other elements ...
<fruits>
<fruit>
<name>apple</name>
<calorien>999</carlorien>
<color>red</color>
</fruit>
<fruit>
<name>cherry</name>
<calorien>999</carlorien>
<color>red</color>
</fruit>
<fruit>
<name>banana</name>
<calorien>999</carlorien>
<color>red</color>
</fruit>
<fruit>
<name>apple2</name>
<calorien>999</carlorien>
<color>red</color>
</fruit>
<fruit>
<name>cherry2</name>
<calorien>999</carlorien>
<color>red</color>
</fruit>
<fruit>
<name>banana2</name>
<calorien>999</carlorien>
<color>red</color>
</fruit>
... and so on ...
<fruits>
... other elements ...
<PARENT_FRUIT>
... other elements ...
</root>
编辑04.06.2019:
我使用 XLST 版本 1.0
如果您可以接受开头分组的所有其他元素,那么以下简单的 XSLT-1.0 样式表就可以完成这项工作。否则,将不清楚要放置<fruits>
元素的位置。
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Identity template -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="PARENT_FRUIT">
<xsl:copy>
<xsl:apply-templates select="*[not(self::fruit)]|@*"/>
<fruits>
<xsl:apply-templates select="fruit"/>
</fruits>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
其输出为:
<?xml version="1.0"?>
<root>
... other elements ...
<PARENT_FRUIT>
<different_node nr="1"/>
<different_node nr="2"/>
<different_node nr="3"/>
<different_node nr="4"/>
<different_node nr="5"/>
<different_node nr="6"/>
<fruits><fruit>
<name>Apple</name>
<calorien>999</calorien>
<color>red</color>
</fruit>
<fruit>
<name>cherry</name>
<calorien>999</calorien>
<color>red</color>
</fruit>
<fruit>
<name>banana</name>
<calorien>999</calorien>
<color>red</color>
</fruit>
<fruit>
<name>Apple2</name>
<calorien>999</calorien>
<color>red</color>
</fruit>
<fruit>
<name>cherry2</name>
<calorien>999</calorien>
<color>red</color>
</fruit>
<fruit>
<name>banana2</name>
<calorien>999</calorien>
<color>red</color>
</fruit>
</fruits>
</PARENT_FRUIT>
...other elements ...
</root>
您可以在fruit[1]
上匹配并将所有fruit
元素包装到fruits
容器中,并在其他fruit
元素上进行匹配以不处理它们:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="fruit[1]">
<fruits>
<xsl:copy-of select="../fruit"/>
</fruits>
</xsl:template>
<xsl:template match="fruit[position() > 1]"/>
</xsl:stylesheet>