-1

ageCode以下のxmlから属性を取得しようとしています。xsltを使用し<Adults>3</Adults>て、ageCode=10または<Children>0</Children>`ageCode=8の場合に入力します。サンプルxmlは次のとおりです。

<Root>
    <Reservations>
        <Reservation>
            <Rooms>
                <Room>
                    <Guests>
                        <Guest ageCode="10" count="3" />
                        <Guest ageCode="8" count="0" />
                    </Guests>
                </Room>
            </Rooms>
        </Reservation>
    </Reservations>
</Root>

私はそれを次のように変換しようとしています:

<Reservation>
    <Rooms>
        <Room>
            <Adults>3</Adults>
            <Children>0</Children>
        </Room>
    </Rooms>
</Reservation>

次のXSLTを使用しますが、動作させることができません(XSLTはまったく使用していません)。

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:element name="Reservation">
  <xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="Root/Reservations/Reservation/Rooms/Room/Guests">
 <xsl:for-each select="Guest">
  <xsl:if test="@ageCode = '10'">
    <xsl:element name="Adults">
      <xsl:value-of select="@count"/>
    </xsl:element>
  </xsl:if>
  <xsl:if test="@ageCode = '8'">
    <xsl:element name="Children">
      <xsl:value-of select="@count"/>
    </xsl:element>
  </xsl:if>
  </xsl:for-each>
  </xsl:template>
  </xsl:stylesheet>

XSLTはどのように機能しますか?これは、テンプレートを適用する上から下に行くという意味ですか?3つのテンプレートが必要だとおっしゃっていたので、それぞれを適用して、新しい変換を行いました。

最初と2番目のテンプレートは実際に何をしますか?最初の適用後にXMLを表示し、次に2番目のXMLを表示する方法はありますか?ここでXSLTを正しく理解していますか?

より深いテンプレートを適用するとはどういう意味ですか?

多くのXSLTを作成する必要がある場合、MapForceのようなツールは役に立ちますか?

4

1 に答える 1

2

3つのテンプレートが必要です。1つは上位2つの要素を破棄し、1つはすべてに一致し、それ自体を出力して再帰するためのもので、もう1つはゲスト->大人の変換を行うためのものです。

最初のものは

<xsl:template match="Root|Reservations">
    <xsl:apply-templates/>
</xsl:template>

何も出力せず、より深いテンプレートを適用します。

2番目は

<xsl:template match="*">
  <xsl:element name="{name(.)}">
  <xsl:apply-templates />
  </xsl:element>
</xsl:template>

それ自体(つまり、現在の名前の要素)を出力し、より深いテンプレートを適用します。

3つ目はあなたが持っているものですが、フルパスではなく「ゲスト」と一致します。

<xsl:template match="Guests">
 <xsl:for-each select="Guest">
  <xsl:if test="@ageCode = '10'">
    <Adults>
      <xsl:value-of select="@count"/>
    </Adults>
  </xsl:if>
  <xsl:if test="@ageCode = '8'">
    <Children>
      <xsl:value-of select="@count"/>
    </Children>
  </xsl:if>
  </xsl:for-each>
</xsl:template>

xsl:elementところで、定数名で使用する必要はなく、リテラルを使用するだけです。

于 2012-07-18T19:37:01.027 に答える