8

次の XML があるとします。

<current>
  <login_name>jd</login_name>
</current>
<people>
  <person>
    <first>John</first>
    <last>Doe</last>
    <login_name>jd</login_name>
  </preson>
  <person>
    <first>Pierre</first>
    <last>Spring</last>
    <login_name>ps</login_name>
  </preson>
</people>

現在/ログインのマッチャー内から「John Doe」を取得するにはどうすればよいですか?

私は次のことを試しました:

<xsl:template match="current/login_name">
  <xsl:value-of select="../people/first[login_name = .]"/>
  <xsl:text> </xsl:text>
  <xsl:value-of select="../people/last[login_name = .]"/>
</xsl:template>
4

5 に答える 5

10

人々にインデックスを付けるためのキーを定義します。

<xsl:key name="people" match="person" use="login_name" />

ここでキーを使用すると、コードがクリーンに保たれますが、子<person>に基づいて要素を取得する必要があることが多い場合は、効率化にも役立つ場合があります。<login_name>

指定された形式の名前を返すテンプレートがあります<person>

<xsl:template match="person" mode="name">
  <xsl:value-of select="concat(first, ' ', last)" />
</xsl:template>

そして、私はします:

<xsl:template match="current/login_name">
  <xsl:apply-templates select="key('people', .)" mode="name" />
</xsl:template>
于 2008-09-15T12:42:47.997 に答える
4

欲しいcurrent()機能

<xsl:template match="current/login_name">
  <xsl:value-of select="../../people/person[login_name = current()]/first"/>
  <xsl:text> </xsl:text>
  <xsl:value-of select="../../people/person[login_name = current()]/last"/>
</xsl:template>

またはもう少しきれい:

<xsl:template match="current/login_name">
  <xsl:for-each select="../../people/person[login_name = current()]">
    <xsl:value-of select="first"/>
    <xsl:text> </xsl:text>
    <xsl:value-of select="last"/>
  </xsl:for-each>
</xsl:template>
于 2008-09-15T09:14:22.613 に答える
1

複数のユーザーにアクセスする必要がある場合は、JeniTの<xsl:key />アプローチが理想的です。

これが私の代替案です:

<xsl:template match="current/login_name">
    <xsl:variable name="person" select="//people/person[login_name = .]" />
    <xsl:value-of select="concat($person/first, ' ', $person/last)" />
</xsl:template>

<person>選択したノードを変数に割り当て、concat()関数を使用して姓名を出力します。

サンプルXMLにもエラーがあります。<person>ノードが誤って</preson>(typo)で終了する

XMLドキュメントの全体的な構造(ルートノードなどを含む)を知っていれば、より良い解決策が得られる可能性があります。

于 2008-09-16T22:18:31.583 に答える
0

彼が実際に望んでいたのは、person ノードの一致ではなく、「現在の」ノードの一致の置換だったと思います。

<xsl:variable name="login" select="//current/login_name/text()"/>

<xsl:template match="current/login_name">
<xsl:value-of select='concat(../../people/person[login_name=$login]/first," ", ../../people/person[login_name=$login]/last)'/>

</xsl:template>
于 2008-09-15T09:14:22.507 に答える
0

私の考えをスタックに追加するだけです

<xsl:template match="login_name[parent::current]">
 <xsl:variable name="login" select="text()"/>
 <xsl:value-of select='concat(ancestor::people/child::person[login_name=$login]/child::first/text()," ",ancestor::people/child::person[login_name=$login]/child::last/text())'/>
</xsl:template>

私は常に、XPath で軸を明示的に使用することを好みます。より冗長ですが、明確な IMHO です。

残りの XML ドキュメントがどのように見えるかによっては (これが単なる断片であると仮定して)、たとえば「ancestor::people[1]」を使用して最初の人に制限するなど、「ancestor::people」への参照を制限する必要がある場合があります。祖先。

于 2008-09-15T10:09:50.313 に答える