1

假设我们有以下 XML...

<FruitBasket>
    <Basket>
        <Apple>1</Apple>
        <Banana>2</Banana>
        <Orange>3</Orange>
    </Basket>
    <Basket>
        <Avocado>1</Avocado>
        <Lemon>2</Lemon>
    </Basket>
</FruitBasket>

使用 XSLT 我将如何生成以下转换?

<BasketContents>
    <Content>
        <FruitName>Apple</FruitName>
        <FruitAmount>1</FruitAmount>
        <FruitName>Banana</FruitName>
        <FruitAmount>2</FruitAmount>
        <FruitName>Orange</FruitName>
        <FruitAmount>3</FruitAmount>
    </Content>
    <Content>
        <FruitName>Avocado</FruitName>
        <FruitAmount>1</FruitAmount>
        <FruitName>Lemon</FruitName>
        <FruitAmount>2</FruitAmount>
    </Content>
</BasketContents>

我通常需要这样做,而不知道篮子里有什么类型的水果 xslt 必须处理“篮子”的任何子元素。例如,我不知道篮子里装的是苹果还是鳄梨,也不知道篮子里有多少种水果。

基本上,这分解为需要知道如何调用子元素的名称,所以从 XML 的<Basket>元素中,我可能会应用一个模板来获取它的未知子元素的名称。

对不起,如果这个类比比有用更令人困惑。

4

1 回答 1

2

如果水果名称不重复(或者如果重复的水果名称会产生两个FruitName,FruitAmount对),那么这样的事情应该可以满足您的需要:

<xsl:template match="/FruitBasket">
  <BasketContents>
    <xsl:apply-templates/>
  </BasketContents>
</xsl:template>

<xsl:template match="Basket">
  <Content>
    <xsl:apply-templates/>
  </Content>
</xsl:template>

<xsl:template match="Basket/*">
  <FruitName>
    <xsl:value-of select="name()"/>
  </FruitName>
  <FruitAmount>
    <xsl:value-of select="."/>
  </FruitAmount>
</xsl:template>

如果您需要检测给定水果的多次出现并将它们的内容相加,那么您将需要阅读 XSLT 上一个很好的参考源中的分组。在 XSLT 1.0 中,要在索引中查找的关键字是“Muenchian grouping”。在 XSLT 2.0 中,分组更简单(有 group-by 结构)。

于 2012-09-20T23:22:50.583 回答