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

果物の名前が繰り返されない場合(または果物の名前の繰り返しが2つFruitNameFruitAmountペアを生成する場合)、次のようなもので必要な処理を実行できます。

<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では、インデックスで検索するキーワードは「Muenchiangrouping」です。XSLT 2.0では、グループ化がより簡単になります(group-by構造があります)。

于 2012-09-20T23:22:50.583 に答える