我需要从XML的一个节点获取数据数组,然后在XSL模板中使用。 输入数据如下:
<InpData>
<period number="1">
<Storage>
<Item weight="10.5" height="5" width="15" length="20"/>
<Item weight="20.75" height="4.5" width="7.3" length="18"/>
<Item weight="10.5" height="5" width="15" length="20"/>
</Storage>
<Transportation>
<Items>
<Item>
<DestRegion value="5"/>
<Sender name="Smith" company="BlueSky" />
<Date day="03" month="03" year="2017" />
<Item/>
<Item>
<DestRegion value="6"/>
<Sender name="Pith" company="BlueSky" />
<Date day="03" month="03" year="2017" />
<Item/>
<Item>
<DestRegion value="5"/>
<Sender name="Bill" company="BlueSky" />
<Date day="03" month="03" year="2017" />
<Item/>
<Items/>
</Transportation>
<period/>
<period number="2">
<period/>
</InpData>
我需要组合节点并具有如下输出xml:
<period number="1">
<Items>
<Item weight="10.5" senderName="Smith"/>
<Item weight="20.75" senderName="Pith"/>
<Item weight="10.5" senderName="Bill"/>
<Items/>
<period/>
我制作了XSLT脚本:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="period">
<xsl:variable name="weight" select="Storage/Item/@weight"></xsl:variable>
<period number="{@number}">
<Items>
<xsl:apply-templates select="Transportation/Items/Item">
<xsl:with-param name="weight_1">
<xsl:value-of select="$weight" />
</xsl:with-param>
</xsl:apply-templates>
</Items>
</period>
</xsl:template>
<xsl:template match="Transportation/Items/Item">
<xsl:param name="weight_1"/>
<xsl:variable name="pos" select="position()"></xsl:variable>
<Item weight="{$weight_1[$pos]}" senderName="{Sender/@name}">
</xsl:template>
</xsl:transform>
但是它不能正常工作。我可以发送到模板,例如,如果我仅使用$ weight_1而不在模板中使用索引,则可以使用。但是我不能在模板中使用$ weight_1 [$ pos]。
请告诉我如何正确使用XSLT中的数组权重?
答案 0 :(得分:0)
为什么不能简单地做:
<xsl:template match="period">
<period number="{@number}">
<Items>
<xsl:for-each select="Storage/Item">
<xsl:variable name="i" select="position()" />
<Item weight="{@weight}" senderName="{../../Transportation/Items/Item[$i]/Sender/@name}"/>
</xsl:for-each>
</Items>
</period>
</xsl:template>
(假设链接项目的唯一方法是它们在其父元素中的位置)。
要按照开始的方式进行操作,您需要执行以下操作:
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:template match="/InpData">
<root>
<xsl:apply-templates select="period"/>
</root>
</xsl:template>
<xsl:template match="period">
<period number="{@number}">
<Items>
<xsl:apply-templates select="Transportation/Items/Item">
<xsl:with-param name="weights" select="Storage/Item/@weight"/>
</xsl:apply-templates>
</Items>
</period>
</xsl:template>
<xsl:template match="Item">
<xsl:param name="weights"/>
<xsl:variable name="i" select="position()" />
<Item weight="{$weights[$i]}" senderName="{Sender/@name}"/>
</xsl:template>
</xsl:stylesheet>