3

XSLTを使用して、同じ要素名を持つすべての子要素を持つ親要素を転送する方法があるかどうか疑問に思っています。

たとえば、元のxmlファイルが次のような場合:

<parent>
  <child>1</child>
  <child>2</child>
  <child>3</child>
</parent>

そして、私はそれをxslで解析しようとします:

<xsl:for-each select="parent">
  <print><xsl:value-of select="child"></print>

このようなものが欲しい:

<print>1</print>
<print>2</print>
<print>3</print>

しかし、私はこれを取得します:

<print>1</print>

for-eachは、この形式用に設計されているためです。

<parent>
  <child>1</child>
<parent>
</parent
  <child>2</child>
<parent>
</parent
  <child>3</child>
</parent

上記のようにフォーマットせずに目的のプリントアウトを取得する方法はありますか?むしろ最初の方法ですか?

ありがとう

4

1 に答える 1

5

これxsl:for-eachは、子ではなく親に対して実行しているためです。これに変更すると、探している結果が得られます(現在のコンテキストがであると仮定/)。

<xsl:for-each select="parent/child">
  <print><xsl:value-of select="."/></print>
</xsl:for-each>

ただし...通常は使用xsl:for-eachする必要はありません。/単一のテンプレート/コンテキスト(のように)からすべての子に到達しようとするのではなく、オーバーライドするテンプレートに作業を処理させる必要があります

例の完全なスタイルシートは次のとおりです。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

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

  <xsl:template match="child">
      <print><xsl:apply-templates/></print>
  </xsl:template>

</xsl:stylesheet>

このスタイルシートの出力は次のようになります。

<print>1</print>
<print>2</print>
<print>3</print>
于 2011-07-06T23:43:26.167 に答える