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」属性の項目の順序が重要であるため、ノードセットが必要だと感じています。
これについての助けやより良い方法をいただければ幸いです。ありがとう!