使用XSLT将不同类型的元素折叠在一起

时间:2013-10-24 14:04:23

标签: xml xslt

说我有以下内容:

<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中是否可行?或者是否有可以采用的不同技术?目标是不必编写程序来执行此操作。

3 个答案:

答案 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-idIDREF 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>