在单独的元素中编写apply-templates的结果

时间:2015-10-14 07:47:32

标签: xml templates xslt

我是xml,xslt的新手,我有两个xml文件。我想比较两个文件并显示第一个文件中存在的记录而不是第二个文件中的记录。

第一个xml:

<employees>
 <employee> 
  <id>1</id>
  <name>aaa</name>
 </employee>
 <employee>
  <id>2</id>
  <name>bbb</name>
 </employee>
 <employee>
  <id>3</id>
  <name>ccc</name>
 </employee>
 <employee>
  <id>4</id>
  <name>ddd</name>
 </employee>
</employees>

第二个xml:

<developers>
 <developer>
  <id>1</id>
  <name>aaa</name>
 </developer>
 <developer>
  <id>3</id>
  <name>ccc</name>
 </developer>
</developers>

我的XSL:

<xsl:stylesheet version="1.0"      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml" indent="yes"/>
 <xsl:param name="updates"   select="document('file:///D:/vishal/Talend_vishal/Examples/14-10- 2015/HMergeAssignment/XML_mog_identiteit.xml')" />

 <xsl:variable name="updateItems" select="$updates/developers/developer" />

 <xsl:template match="/employees/employee">
   <xsl:apply-templates select="id"/>
 </xsl:template>

 <xsl:template match="/employees">
  <refid><xsl:apply-templates select="employee[not(id = $updateItems/id)]"/>
 </refid>
 </xsl:template>
</xsl:stylesheet>

我的输出:

<refid>24</refid>

必需的输出:

<refid>2</refid>
<refid>4</refid>

1 个答案:

答案 0 :(得分:0)

您已将refid元素的创建放在错误的位置。您已将其放在与employees匹配的模板中,其中XML中只有一个此类元素。你应该把它放在匹配employee

的模板中
<xsl:stylesheet version="1.0"      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml" indent="yes"/>
 <xsl:param name="updates"   select="document('file:///D:/vishal/Talend_vishal/Examples/14-10- 2015/HMergeAssignment/XML_mog_identiteit.xml')" />

 <xsl:variable name="updateItems" select="$updates/developers/developer" />

 <xsl:template match="/employees/employee">
   <refid>
     <xsl:apply-templates select="id"/>
   </refid>
 </xsl:template>

 <xsl:template match="/employees">
  <refids>
    <xsl:apply-templates select="employee[not(id = $updateItems/id)]"/>
  </refids>
 </xsl:template>
</xsl:stylesheet>

注意,我在refids模板中创建了一个employees元素,只是为了让XSLT输出结构良好的XML。