4

キーと値のペアの束をパラメーターとして XSL に渡しています (日付 -> "1 月 20 日"、作成者 -> "ドミニク ロジャー"、...)。

これらは、私が解析している XML で参照されています。XML は次のようになります。

<element datasource="date" />

現時点では、恐ろしい<xsl:choose>声明を除いて、これらから1月20日を取得する方法を理解できません。

<xsl:template match="element">
  <xsl:choose>
    <xsl:when test="@datasource = 'author'">
      <xsl:value-of select="$author" />
    </xsl:when>
    <xsl:when test="@datasource = 'date'">
      <xsl:value-of select="$date" />
    </xsl:when> 
    ...
  </xsl:choose>
</xsl:template>

次のようなものを使用したいと思います:

<xsl:template match="element">
  <xsl:value-of select="${@datasource}" />
</xsl:template>

しかし、これは不可能だと思います。外部関数呼び出しの使用を開始していますが、XSL で可能なすべてのマップ キーを列挙する必要は避けたいと考えています。何か案は?

ありがとう、

ドム

4

3 に答える 3

2

考えられる解決策の1つを次に示しdocument()ますが、すべてのパラメーターを個別のXMLファイルにグループ化し、関数を使用してそれらにアクセスすることをお勧めします。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common"
 exclude-result-prefixes="ext"
 >
 <xsl:output method="text"/>

 <xsl:param name="date" select="'01-15-2009'"/>
 <xsl:param name="author" select="'Dominic Rodger'"/>
 <xsl:param name="place" select="'Hawaii'"/>
 <xsl:param name="time" select="'midnight'"/>

 <xsl:variable name="vrtfParams">
   <date><xsl:value-of select="$date"/></date>
   <author><xsl:value-of select="$author"/></author>
   <place><xsl:value-of select="$place"/></place>
   <time><xsl:value-of select="$time"/></time>
 </xsl:variable>

 <xsl:variable name="vParams" select="ext:node-set($vrtfParams)"/>

    <xsl:template match="element">
      <xsl:value-of select=
       "concat('&#xA;', @datasource, ' = ',
               $vParams/*[name() = current()/@datasource]
               )"
       />
    </xsl:template>
</xsl:stylesheet>

この変換が次のXMLドキュメントに適用される場合

<data>
  <element datasource="date" />
  <element datasource="place" />
</data>

正しい結果が生成されます:

日付=2009年1月15日

場所=ハワイ

RTF(結果ツリーフラグメント)を通常のxmlドキュメント(一時ツリー)に変換するためのxxx:node-set()関数(ここではEXSLTのものが使用されています)の使用に注意してください。

于 2009-01-15T15:03:30.807 に答える
0

@datasource が常にパラメーター名と一致する場合は、「評価」機能を試すことができます。注: このコードはテストされていません。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:exslt-dynamic="http://exslt.org/dynamic"
>

<xsl:param name="date"/>

<xsl:template match="element">
  <xsl:value-of select="exslt-dynamic:evaluate('$' + @datasource)"/>
</xsl:template>

</xsl:stylesheet>
于 2009-01-19T14:22:36.587 に答える
-2

どうですか

<xsl:template match="date-element">
  <xsl:text>${date}</xsl:text>
</xsl:template>

つまり、属性を使用する代わりに、異なる要素名を使用して一致させます。

ソース XML を変更できない場合は、属性を正​​しい要素名に変換する小さな XSLT を実行します。

別の解決策として、xsl:param 要素を別の XML ドキュメントに配置します (または、XSLT テンプレート自体を再度読み取らせます)。次に、 xsl:key と key() を使用してそれらを参照できます。

[編集] xsl:value-of を xsl:text に置き換えました。手元に XSLT ユーティリティがないため、これをテストできません。これでもうまくいかない場合は、コメントを投稿してください。

于 2009-01-15T11:36:14.343 に答える