5

これは不可能だと思いますが、明確な答えが欲しいと思います。

XML:

  <agentlang>French</agentlang>
  ...
  <books>
    <book>
      <title>My Book</title>
      <author>Me</author>
    </book>
    <book>
      <title>XPath 101</title>
      <author>You</author>
  </book>
  ...
 </books>
 .....
 <translations>
    <translation English="title" French="titre" German="Titel" />
    <translation English="author" French="auteur" German="Autor" />
 </translations>

次に、XSLにはメインの本の情報の単純な変換がありますが、翻訳xmlに従ってヘッダーを翻訳したいのですが、次のように機能します。

<xsl:value-of select="//translation[@English='title']/@French"/>
<xsl:value-of select="//translation[@English='Author']/@French"/>

しかし、属性@FrenchをXMLのagentlang値に置き換えたい

MSXML /XSLT1.0を使用しています

これを行う方法はありますか?

4

2 に答える 2

8

はい、を使用しlocal-name()て、特定の動的値を持つ要素または属性を見つけることができます。ルックアップ値をxsl:variableに保存しました:

<xsl:variable name="lang" select="//agentlang/text()" />
<xsl:value-of select="//translation[@English='title']/@*[local-name()=$lang]" />

名前空間が関係している場合は、のチェックも含めることをおnamespace-uri()=...勧めします。もちろん、同じ名前で異なる名前空間に2つの要素が存在する可能性があるためです。

編集

後から考えると、変数を使用すると、変換の読み取り/保守が容易になる場合がありますが、必須ではありません。これは直接実行することもできます。

<xsl:value-of select="//translation[@English='title']/@*[local-name()=//agentlang]" />
于 2012-09-17T15:00:59.573 に答える
0

テンプレートでも同じ結果が得られます

<xsl:template name="translate_english_to_local">
  <xsl:param name="text>

  <xsl:value-of select="//translation[@English=$text]/@*[local-name()=//agentlang]" />

</xsl:template>

その結果、次のようになります。

<xsl:call-template="translate_english_to_local">
    <xsl:with-param name="text">title</xsl:with-param>
</xsl:call-template>
  • コードを読みやすくする
  • 翻訳ライブラリを変更する場合は、テンプレートを更新すると、残りが続きます。
于 2016-09-26T15:46:46.120 に答える