有条件地匹配当前节点值

Pie*_*ing 8 xslt xpath xmlnode

给出以下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>
Run Code Online (Sandbox Code Playgroud)

如何从当前/登录匹配器中获取"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>
Run Code Online (Sandbox Code Playgroud)

Jen*_*niT 10

我定义了一个为人们编制索引的键:

<xsl:key name="people" match="person" use="login_name" />
Run Code Online (Sandbox Code Playgroud)

在这里使用密钥只是保持代码干净,但如果您经常需要<person>根据<login_name>子代检索元素,您可能还会发现它对提高效率很有帮助.

我有一个模板返回给定的格式化名称<person>:

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

然后我会这样做:

<xsl:template match="current/login_name">
  <xsl:apply-templates select="key('people', .)" mode="name" />
</xsl:template>
Run Code Online (Sandbox Code Playgroud)