我有一个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。
我不明白这里有什么问题。
答案 0 :(得分:2)
//users/user[username=reporter]/userid
查找包含相等user
和username
元素的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 进行查找。