0

说我有以下内容:

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

4

3 回答 3

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>
于 2013-10-24T14:37:10.760 回答
0

如果您的问题只是这在 XSLT 中是否可行?是的 ,这很有可能而且很容易假设food-idIDREFid<food>

于 2013-10-24T14:18:56.817 回答
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>
于 2013-10-24T14:32:36.420 回答