0

XSLT1.0を使用しています。基本的に、属性の値に基づいて出力を作成しようとしています。これが私が変換しているXMLの例です:

<object include="name number" id="5" />

これは、「id」属性によって参照されているデータの例です。

<People>

  ...

  <row>
    <id>5</id>
    <number>1455210</number>
    <name>Mike</name>
    <age>38</age>
    <city>London</city>
  </row>

  ...

</People>

これが私のコードの一部です:

<xsl:template match="object">
  <param name="id" select="@id" />
  <param name="filename">
    ...
  </param>

  ...

  <xsl:apply-templates select="document($filename)//row[id=$id]">
    <xsl:with-param name="include" >
      <xsl:call-template name="tokenize">
        <xsl:with-param name="string" select="@include" />
      </xsl:call-template>
    </xsl:with-param>
  </xsl:apply-templates>
</xsl:template>

<xsl:template match="row">
  <xsl:param name="include" />

  <xsl:for-each select="exsl:node-set($include)/token">
    <span type="{.}">
      INSERT VALUE OF ORIGINAL NODE HERE (i.e. the value of the child of the "row" node with name current() or ".")
    </span>
  </xsl:for-each>
</xsl:template>

<xsl:template name="tokenize">
  <param name="string" />

  Turn a string with multiple values (i.e. "car dog hat") into an XML string
</xsl:template>

@idの代わりに$idを使用する以外に、私の問題は、for-eachループに入った後に「行」テンプレートに渡されたノードを参照することです。元のXMLを前提として、次の出力が必要です。

<span type="name">Mike</span>
<span type="number">1455210</span>

代わりに、私は次のものを取得することしかできません:

<span type="name">name</span>
<span type="number">number</span>

一連の「if」ステートメントを使用して何もトークン化しないこともできますが、「include」属性の項目の順序が重要であるため、ノードセットが必要だと感じています。

これについての助けやより良い方法をいただければ幸いです。ありがとう!

4

1 に答える 1

3

外部コンテキスト ノードを変数に格納する

<xsl:template match="row">
  <xsl:param name="include" />
  <xsl:variable name="curRow" select="."/>

$curRowその後、内部の for-each を含め、テンプレート内の任意の場所にアクセスできます。

于 2012-11-25T01:49:14.017 に答える