说我有以下内容:
<document>
<foods>
<food id = "1" name="apple"></food>
</foods>
<shopping-list>
<item food-id="1" qty="10"></item>
</shopping-list>
</document>
如何使用XSLT创建一个元素列表,这些元素组合了来自项目及其引用食物的数据。
例如:
<food-item-list>
<food-item name="apple" qty="10">
</food-item>
</food-item-list>
这在XSLT中是否可行?或者是否有可以采用的不同技术?目标是不必编写程序来执行此操作。
答案 0 :(得分:2)
XSLT中这种交叉引用的有效方法是定义密钥
<xsl:key name="foodById" match="food" use="@id" />
然后,您可以使用key
函数查找给定特定food
值的id
元素。
<xsl:template match="item">
<food-item qty="{@qty}" name="{key('foodById', @food-id)/@name}" />
</xsl:template>
或者,如果您不想对属性名称进行硬编码,只想要两个元素的所有属性(交叉引用本身除外),那么
<xsl:template match="item">
<food-item>
<xsl:copy-of select="@*[local-name() != 'food-id']" />
<xsl:copy-of select="key('foodById', @food-id)/@*[local-name() != 'id']" />
</food-item>
</xsl:template>
答案 1 :(得分:0)
如果您的问题只是这是否可以在XSLT中使用?是的,假设food-id
为IDREF
id
<food>
,则非常可能而且很容易{1}}
答案 2 :(得分:0)
尝试尺寸:
<xsl:for-each select="food">
<xsl:element name="food-item">
<xsl:attribute name="name">
<xsl:value-of select="@name" />
</xsl:attribute>
<xsl:attribute name="qty">
<xsl:value-of select="//shopping-list/item[@food-id=current()/@id]/@qty"/>
</xsl:attribute>
</xsl:element>
</xsl:for-each>