XSL:根据另一个节点的内容查找节点

时间:2012-03-10 22:57:27

标签: xml xslt

我有一个XML文件,如下所示:

<container>
<bugs>
    <bug id="b1">
        <reporter>Tom</reporter>
        ...
    </bug>
    <bug id="b2">
        <reporter>Jane</reporter>
        ...
    </bug>
</bugs>
<users>
    <user>
        <userid>10</userid>
        <username>Tom</username>
    </user>
    <user>
        <userid>5</userid>
        <username>Jane</username>
    </user>
</users>
</container>

结果应该是:

<items>
    <item>
        <bugid>b1</bugid>
        <author id="10">Tom</author>
    </item>
    <item>
        <bugid>b2</bugid>
        <author id="5">Jane</author>
    </item>
</items>

问题:我无法对id查找进行正确的比较。

我认为它会是这样的:

<xsl:template match="bug">
....
    <xsl:element name="author">
        <xsl:attribute name="id">
            <xsl:value-of select="//users/user[username=reporter]/userid"/>
        </xsl:attribute>
    </xsl:element>
....
</xsl:template>

但是这会返回一个空id(id =“”)。

<xsl:value-of select="//users/user[username='Tom']/userid"/>

返回10 和

<xsl:value-of select="reporter"/>

返回Tom。

我不明白这里有什么问题。

2 个答案:

答案 0 :(得分:2)

//users/user[username=reporter]/userid

查找包含相等userusername元素的reporter。它不会在reporter中搜索bug

您可以通过首先将报告者的名称绑定到变量来实现此目的:

<xsl:element name="author">
  <xsl:variable name="reporter" select="string(reporter)"/>
  <xsl:attribute name="id">
    <xsl:value-of select="//users/user[username=$reporter]/userid"/>
  </xsl:attribute>
</xsl:element>

答案 1 :(得分:0)

此转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:key name="kUIdByName" match="userid" use="../username"/>

 <xsl:template match="bugs">
  <items>
   <xsl:apply-templates/>
  </items>
 </xsl:template>

 <xsl:template match="bug">
  <item>
   <bugid><xsl:value-of select="@id"/></bugid>
   <xsl:apply-templates/>
  </item>
 </xsl:template>

 <xsl:template match="reporter">
  <author id="{key('kUIdByName',.)}"><xsl:value-of select="."/></author>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

应用于提供的XML文档

<container>
    <bugs>
        <bug id="b1">
            <reporter>Tom</reporter>     
        </bug>
        <bug id="b2">
            <reporter>Jane</reporter>     
        </bug>
    </bugs>
    <users>
        <user>
            <userid>10</userid>
            <username>Tom</username>
        </user>
        <user>
            <userid>5</userid>
            <username>Jane</username>
        </user>
    </users>
</container>

生成想要的正确结果

<items>
   <item>
      <bugid>b1</bugid>
      <author id="10">Tom</author>
   </item>
   <item>
      <bugid>b2</bugid>
      <author id="5">Jane</author>
   </item>
</items>

解释:正确使用 keys 进行查找。